题目:
题解:
一种可行的方法是用一个普通的二分查找即可:每次取一个数索引为x同时可以得到索引为x+1和x-1的数,如果在山峰之前索引为x+1的数是这相邻的三个数中最大的调整l=mid,如果在山峰之后索引为x-1的值是这三个相邻的数中最大的调整r=mid,如果索引为x的数刚好是相邻三数中最大的即找到答案。
int peakIndexInMountainArray(vector<int>& arr) {
int l=0,r=arr.size()-1,mid;
while(l<=r){
mid=(l+r)>>1;
if(mid-1>=0&&mid+1<arr.size()&&arr[mid]==max({arr[mid],arr[mid-1],arr[mid+1]}))return mid;
else if(mid-1>=0&&mid+1<arr.size()&&arr[mid+1]==max({arr[mid],arr[mid-1],arr[mid+1]}))l=mid;
else r=mid;
}
return -1;
}
题后反思:
本道题在更新二分查找左右端点时,不可以只用r=mid-1,l=mid+1,而要在需要更新时的写法是:
r=mid,l=mid,因为山峰纯在于严格的相邻三数中,这样写能保证每次都够取出相邻的三个数。