题目
峰值元素是指其值严格大于左右相邻值的元素。
给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
你可以假设 nums[-1] = nums[n] = -∞ 。
你必须实现时间复杂度为 O(log n) 的算法来解决此问题。
思路
先上结论:二分查找大的那一半一定会有峰值,即nums[mid] < nums[mid+1]
时,mid+1~N
一定存在峰值
首先已知 nums[mid+1] > nums[mid]
,那么mid+2
只有两种可能,一个是大于mid+1
,一个是小于mid+1
,小于mid+1
的情况,那么mid+1
就是峰值,大于mid+1的情况,继续向右推,如果一直到数组的末尾都是大于的,那么可以肯定最后一个元素是峰值,因为nums[nums.length]
=负无穷
简单来说就是,上坡必有坡顶,后面元素要么下坡,要么上坡(最后一个元素就是坡顶)
class Solution {
public int findPeakElement(int[] nums) {
int l = 0;
int r = nums.length -1;
while(l < r){
int mid = l + (r - l) / 2;
//找大的那部分,nums[mid] < nums[mid+1]时,mid+1 ~ N 一定存在峰值
if(nums[mid] < nums[mid + 1]){
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
}