题解 | #寻找峰值#
寻找峰值
https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76
- nums[mid] < nums[mid+1] :右边一定是存在峰值的 因为从mid开始的单调性要么是/\ (先增后减)要么是/ (单调递增)都有峰值 因为nums[-1] nums[n]都是负无穷
- nums[mid] > nums[mid-1] :左边的单调性/(从mid往左单调递减) \/ (从mid往左先减后增)从mid往左递减不存在峰值 先减后增 那么nums[0]是峰值
package main /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型 */ func findPeakElement( nums []int ) int { // write code here if len(nums) == 1 { return 0 } left, right, n := 0, len(nums) - 1, len(nums) const INF = ^int(^uint(0) >> 1) for left <= right { mid := (left + right) >> 1 l, r := INF, INF if mid - 1 >= 0 { l = nums[mid - 1] } if mid + 1 < n { r = nums[mid + 1] } if nums[mid] > l && nums[mid] > r { return mid } if nums[mid + 1] > nums[mid] { //右边一定是存在峰值的 因为从mid开始的单调性要么是/\ 要么是/ 都有峰值 因为nums[-1] nums[n]都是负无穷 left = mid + 1 }else { //左边的单调性/ \/ 从mid往左递减不存在峰值 先减后增 那么nums[0]是峰值 right = mid - 1 } } return right }

查看1道真题和解析