二分法:leetcode 162 寻找峰值
本文讲解了寻找峰值的最优算法以及背后的二分法思想。
峰值元素是指其值严格大于左右相邻值的元素。 给你一个整数数组 nums
,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞
。 你必须实现时间复杂度为 \(O(\log n)\) 的算法来解决此问题。
示例1:
1输入:nums = [1,2,3,1]
2输出:2
3解释:3 是峰值元素,你的函数应该返回其索引 2。
示例2:
1输入:nums = [1,2,1,3,5,6,4]
2输出:1 或 5
3解释:你的函数可以返回索引 1,其峰值元素为 2;
4 或者返回索引 5, 其峰值元素为 6。
解法:
1package main
2
3import (
4 "fmt"
5 "math"
6)
7
8func findPeakElement(nums []int)int{
9 var left = 0
10 var right = len(nums)-1
11 for ; left < right; {
12 var mid = int(math.Floor(float64(left + right)/2))
13 if nums[mid] > nums[mid + 1]{
14 right = mid
15 } else {
16 left = mid + 1
17 }
18 }
19 return left
20}