参考资料:左程云算法课
思路:二分法
首先判断左右两端点是否是峰值,
如果是,则返回其下标,并结束;如果不是,说明左右两端点都小,峰值必然在余下(中间部分)取到,则用二分法检查nums[1…n-2]。
具体地,找中间位置的数,看他是不是峰值,如果不是,那么可以通过它和其邻居的大小判断,下次应该去哪一侧做检查。
public int findPeakElement(int[] arr){
int n = arr.length;
if(n<2)
{
return 0;
}
if(arr[0]>arr[1])
{
return 0;
}
if(arr[n-2]<arr[n-1])
{
return n-1;
}
int l = 1;
int r=n-2;
int m=0;
while(l<=r)
{
m = ((r+l)>>1);
if(arr[m]>arr[m-1] && arr[m]>arr[m+1])
{
return m;
}else if(arr[m-1]>=arr[m])
{
r = m-1;
}else{
l = m+1;
}
}
return l;
}