问题描述
解决方案
二分法
我们先来说一下二分搜索常用的模板,一般有两种
第一种:
int biDivide(vector<int>& arr) {
int n = arr.size();
int left = 0, right=n-1;
int ans;
while(left<=right){
int mid = (left+right)/2;
if(条件){
赋值
right=mid-1;
}
else{
left=mid+1;
}
}
return ans;
}
第二种:
int biDivide(vector<int>& arr) {
int n = arr.size();
int left = 0, right=n-1;
int ans;
while(left<right){
int mid = left + (right - left) / 2;
if(条件){
ans = XXX;
right=mid;
}
else{
left=mid+1;
}
}
return ans;
}
第二种方法可以避免中间的mid数值超过int上限。
回到我们这个题目,这个题目可以用第一种二分模板解决,但是需要填入合适的条件,我们思考一下,这个数组是一个先增大,后变小的数组,所以,我们要是能够找到第一个满足 a r r [ a n s ] > a r r [ a n s + 1 ] arr[ans]>arr[ans+1] arr[ans]>arr[ans+1]的下表数字就找到了我们所求的答案,所以条件就可以填写 a r r [ a n s ] > a r r [ a n s + 1 ] arr[ans]>arr[ans+1] arr[ans]>arr[ans+1],具体看代码实现:
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int n = arr.size();
int left = 0, right=n-2;
int ans;
while(left<=right){
int mid = (left+right)/2;
if(arr[mid]>arr[mid+1]){
ans=mid;
right=mid-1;
}
else{
left=mid+1;
}
}
return ans;
}
};