二分法: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}

翻译: