0%

852.山脉数组的峰顶索引

1. 朴素

直接O(n)扫描一遍,记录最大值索引。

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int peakIndexInMountainArray(vector<int>& A) {
int n = A.size();
int ans = 0;
for (int i = 0; i < n; i++)
if (A[i] > A[ans])
ans = i;

return ans;
}
};

2. 二分

二分根据mid判断是递增一侧还是递减一侧,复杂度O(logn)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
int peakIndexInMountainArray(vector<int>& A) {
int l = 0, r = A.size() - 1;
int ans = 0;
while (l <= r) {
int mid = (l + r) / 2;
if (mid == 0) {
ans = A[ans] > A[r] ? ans : r;
break;
}
ans = A[ans] > A[mid] ? ans : mid;
if (A[mid] > A[mid - 1] && A[mid] > A[mid + 1])
break;
else if (A[mid] >= A[mid - 1])
l = mid + 1;
else if (A[mid] <= A[mid - 1])
r = mid - 1;
}

return ans;
}
};