寻找峰值——二分

73 阅读1分钟

image.png

代码:

  1. get 函数方便处理下标越界情况
  2. 因为相邻元素不相同,所以根据相邻元素的比较从而做出判断
  3. 我们总是走向更大的那个元素,更大的元素那边一定存在峰值,而更小的元素那边一定存在,谷底
func findPeakElement(nums []int) int {
    n := len(nums)

    // 辅助函数,输入下标 i,返回 nums[i] 的值
    // 方便处理 nums[-1] 以及 nums[n] 的边界情况
    get := func(i int) int {
        if i == -1 || i == n {
            return math.MinInt64
        }
        return nums[i]
    }

    left, right := 0, n-1
    for {
        mid := (left + right) / 2
        if get(mid-1) < get(mid) && get(mid) > get(mid+1) {
            return mid
        }
        if get(mid) < get(mid+1) {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
}