A peak element is an element that is greater than its neighbors.
Given an input array nums
, where nums[i] ≠ nums[i+1]
, find a peak element and return its index.
The array may contain multiple peaks, in that case return the index to any one of the peaks is fine.
You may imagine that nums[-1] = nums[n] = -∞
.
Example 1:
Input: nums = [1,2,3,1]
Output: 2
Explanation: 3 is a peak element and your function should return the index number 2.
Example 2:
Input: nums = [
1,2,1,3,5,6,4]
Output: 1 or 5
Explanation: Your function can return either index number 1 where the peak element is 2,
or index number 5 where the peak element is 6.
时间复杂度:o(nlogn),联想到二分查找。
对于中点,如果左右两端任一方比中点大,则意味着一方有坡(边界负无穷),此时只要坡顶不是重复数字, 则该坡为一个峰。
实现:
class Solution {
public int findPeakElement(int[] nums) {
int left=0,right=nums.length-1;
int mid=left+(right-left)/2;
while(left<=right){
//最终结果:left和right相邻,且nums[left]比左边大,nums[right]比右边大
//峰值为二者之一
if(mid==left){
return nums[left]>nums[right]?left:right;
}
if(nums[mid]<nums[mid+1]){
//峰值在右
left=mid;
}else if(nums[mid]>nums[mid+1]){
//峰值在左
right=mid;
}
mid=left+(right-left)/2;
}
return 0;
}
}