题目描述
AC代码
/*
1.如果题目要求中没有说明nums[i]≠ nums[i+1],那么这个题目是没有办法用二分法去做的.
为什么可以用二分法解题?
通过二分法让nums[mid]和nums[mid+1]作比较,如果mid位置上的数比右边的小,那么
mid的右侧一定会出现一个峰值(无论是单调递增还是出现波峰波谷的情况),通过二分法
还可以少扫描一部分,降低复杂度。
2.边界问题:
代码中出现了mid+1,可能会觉得当nums[mid]=nums[len-1]的时候,nums[mid+1]超出了数组边界
其实不然,l=r,会退出循环,不会发生边界问题。举个例子:
输入: nums = [1,2,3,1]
输出: 2
解释:
第一次 l=0 r=3 mid=1 l=2 r=3
第二次 l=2 r=3 mid=2 l=2 r=2
第三次 l=2 r=2 退出while循环,不会发生边界问题
3.这个题也可以通过循环来做,此时复杂度为O(n),通过二分法可以使复杂度降到O(logn)
*/
class Solution {
public int findPeakElement(int[] nums) {
int l=0,r=nums.length-1;
while(l<r){
int mid=l+r>>1;
if(nums[mid]<nums[mid+1])
l=mid+1;
else
r=mid;
}
return l;
}
}