题意:只要有元素就一定有峰值 因为任意相邻元素不等,及数组前后是负无穷
思路:二分查找中间值,
如果arr[mid]>arr[mid+1] 峰值肯定在mid及其左边,右边丢弃,right=mid;
【这种情况属于m在”上坡“,也就是右边可能继续”增“的趋势】
如果arr[mid]<arr[mid+1] 峰值肯定在mid+1及其右边,左边丢弃,left=mid+1;
【这种情况属于m在”下坡“,也就是左边可能是”增“的趋势,而右边是”减“趋势,当然存在波段,但是因为我们只考虑一个”峰“,所以不考虑波段】
当left==right 这个arr[left]即为峰值
方法一:遍历(暴力破解)
class Solution {
public int findPeakElement(int[] nums) {
//不存在的情况
if(nums==null || nums.length==0)
return -1;
if(nums.length==1)
return 0;
//考虑头尾
int len=nums.length;
if(nums[0]>nums[1])
return 0;
if(nums[len-1]>nums[len-2])
return len-1;
//考虑中间
int i=1;
while(i<len-1)
{
if(nums[i]>nums[i-1] && nums[i]>nums[i+1])
return i;
else
i++;
}
return -1;
}
}
最坏时间复杂度O(n) 空间复杂度 常数级O(1)
方式二:二分查找
class Solution {
public int findPeakElement(int[] nums) {
if(nums==null || nums.length==0)
return -1;
if(nums.length==1)
return 0;
int left=0;
int right=nums.length-1;
int mid=0;
while(left<right)
{
mid=left+(right-left)/2;
if(nums[mid]>nums[mid+1])
{
right=mid;
}
else if(nums[mid]<nums[mid+1])
{
left=mid+1;
}
}
return left;
}
}