1. 题目来源
2. 题目解析
数据太强,搞得这题没啥意思了。
等价于寻找数组中的最大值,且最大值左右两段均严格递减。
**可以一次遍历也可以二分,不过这个二分有点考思维…
- 需要定义一个性质,该性质具有二段性,保证能够二分。这个性质就是单调性。
mid
出来之后,用a[mid-1]
与a[mid]
的大小关系来判断mid
再哪一段中,再进行二分即可。- 所以这道题至少包含 3 个值…**
时间复杂度: O ( l o g n ) O(logn) O(logn)
空间复杂度: O ( 1 ) O(1) O(1)
O ( n ) O(n) O(n)
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int res = 0;
while (arr[res] < arr[res + 1]) res ++ ;
return res;
}
};
O ( l o g n ) O(logn) O(logn)
// 花里胡哨的二分
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int l = 1, r = arr.size() - 2;
while (l < r) {
int mid = l + r + 1 >> 1;
if (arr[mid] > arr[mid - 1]) l = mid;
else r = mid - 1;
}
return r;
}
};