峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。
思路:
因为题目将数组边界看成最小值,而我们只需要找到其中一个波峰,因此只要不断地往高处走,一定会有波峰。那我们可以每次找一个标杆元素,将数组分成两个区间,每次就较高的一边走,因此也可以用分治来解决,而标杆元素可以选择区间中点。
具体做法:
- step 1:二分查找首先从数组首尾开始,每次取中间值,直到首尾相遇。
- step 2:如果中间值的元素大于它右边的元素,说明往右是向下,我们不一定会遇到波峰,但是那就往左收缩区间。
- step 3:如果中间值大于右边的元素,说明此时往右是向上,向上一定能有波峰,那我们往右收缩区间。
- step 4:最后区间收尾相遇的点一定就是波峰。
图示
代码如下:
public int findPeakElement (int[] nums) {
int left = 0,right = nums.length - 1;
while(left < right){
int mid = left + (right-left)/2;
//右边是往上,一定能找到波峰
if(nums[mid] < nums[mid+1])
left = mid + 1;
//左边是往上,一定能找到波峰
else if(nums[mid] > nums[mid+1])
right = mid;
}
return right;
}
?
|