因为题目数据保证arr是一个山脉数组,故这题就是寻找满足arr[mid]>arr[mid+1]&&arr[mid]>arr[mid-1]的位置mid,故可以采用二分法使算法复杂度O(log(n))
左闭右闭区间搜索法:
int peakIndexInMountainArray(vector<int>& arr) {
int left=0,right=arr.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(arr[mid]>arr[mid+1]&&arr[mid]>arr[mid-1]){
return mid;
}else if(arr[mid]>arr[mid+1]){
right=mid-1;
}else{
left=mid+1;
}
}
return false;
}
左闭右开区间搜索法:
int peakIndexInMountainArray(vector<int>& arr) {
int left=0,right=arr.size();
while(left<right){
int mid=left+(right-left)/2;
if(arr[mid]>arr[mid+1]&&arr[mid]>arr[mid-1]){
return mid;
}else if(arr[mid]>arr[mid+1]){
right=mid;
}else{
left=mid+1;
}
}
return false;
}
注:本道题和第leetcode第852题完全一样
关于左闭右闭、左闭右开区间搜索法;二分查找寻找左边界、二分查找寻找右边界问题详述请看我的专栏:算法之二分查找理论(三种问题类型、两种算法形式)