题目:
分析:
- 因为题目中要找的是任意一个峰值即可, 所以和<山脉数组的峰值索引>这道题差不多
- 因为峰值左右都小于峰值, 所以具有"二段性", 可以使用二分查找算法
- 如果nums[mid] < nums[mid + 1], mid一定不是峰值, 所以left = mid + 1
- 如果nums[mid] > nums[mid + 1], mid可能是峰值, 所以right = mid
- 因此匹配二分查找算法的模版二, mid = left +(right - left) /2
- 唯一与<山脉数组的峰值索引>这道题不同的是, <山脉数组的峰值索引>数组中只有一个峰值, 而这道题我们用二分查找找的是最接近中间的峰值, 说明不是只有严格的有序才能用二分查找
代码:
class Solution {
public int findPeakElement(int[] nums) {
int left = 0;
int right = nums.length-1;
while(left < right){
int mid = left +(right - left) /2;
if(nums[mid] > nums[mid + 1]) right = mid;
else left = mid + 1;
}
return left;
}
}