题目来源
题目描述
题目解析
二分
使用[二分]进行查值,需要确保序列本身满足二段线:当选定一个基准值之后,结合[一段满足/一段不满足]的特性来实现“折半”的查找效果。
对于本题,由于arr数值各不相同,因此峰顶元素左侧必然严格单调递增,峰顶元素右侧必然不满足
因此以峰顶元素为分割点的 arr 数组,根据与 前一元素/后一元素 的大小关系,具有二段性:
- 峰顶元素左侧满足 arr[i-1] < arr[i]arr[i−1]<arr[i] 性质,右侧不满足
- 峰顶元素右侧满足 arr[i] > arr[i+1]arr[i]>arr[i+1] 性质,左侧不满足
因此我们可以选择任意条件,写出若干「二分」版本
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int L = 0, R = arr.size();
while (L < R){
int M = L + (R - L) / 2;
if(arr[M] < arr[M + 1]){
L = M + 1;
}else{
R = M;
}
}
return L;
}
};
类似题目
二分专题