注意题目中假定的是nums[-1]==nums[n]=负无穷,解法见注释
class Solution {
public int findPeakElement(int[] nums) {
if(nums.length==0)
return 0;
int left=0,right=nums.length-1;
int mid=0;
while(left<right){
mid=left+(right-left)/2;
if(nums[mid]<nums[mid+1])//为什么不用考虑mid+1数组越界?
left=mid+1;//因为这里取得是左中位数mid=left+(right-left)/2;如果只剩两个数,mid=0,
//mid+1不会越界,如果只剩一个数,说明left=right,此时已经跳出循环
else
right=mid;//不能写mid-1,因为此时是nums[mid]>nums[mid+1],因此峰值出现在包含着mid的左边
}
return left;
}
}
下面是右边界的解法:注意区别
class Solution {
public int findPeakElement(int[] nums) {
if(nums.length==0)
return 0;
int left=0,right=nums.length-1;
int mid=0;
while(left<right){
mid=left+(right-left+1)/2;//右边界
if(nums[mid]<nums[mid-1]//因此这里是mid-1,也不会越界
right=mid-1;
else
left=mid;
}
return left;
}
}
LeetCodeNo.162寻找峰值(二分查找)
最新推荐文章于 2023-10-04 12:19:56 发布