这题是binary search的经典题。
我们可以看A[mid]跟左右两个元素的比较,无非四种情况:
- 中间>左 && 中间>右,此为波峰,直接返回
- 中间>左 && 中间<右,切左边
- 中间<左 && 中间>右,切右边
- 中间<左 && 中间<右,切左切右都可。
第4种情况可以与第1,2种合并。
代码如下:
int findPeak(vector<int>& A) {
int start=0, end=A.size()-1;
while(start+1<end) {
int mid=start+(end-start)/2;
if (A[mid]>A[mid-1] && A[mid]>A[mid+1]) return mid;
if (A[mid]<A[mid-1] && A[mid]>A[mid+1]) end=mid;
else start=mid;
}
return A[start]>A[end]? start:end;
}
二刷代码如下:
class Solution {
public:
/**
* @param A: An integers array.
* @return: return any of peek positions.
*/
int findPeak(vector<int> &A) {
int n = A.size();
if (n <= 1) return n - 1;
int start = 0, end = n - 1;
while(start + 1 < end) {
int mid = start + (end - start) / 2;
// if (mid == 0) return -1;
if (A[mid] > A[mid - 1] && A[mid] > A[mid + 1]) return mid;
if (A[mid - 1] < A[mid]) start = mid;
else if (A[mid - 1] > A[mid]) end = mid;
}
return -1;
}
};
三刷:
class Solution {
public:
/**
* @param a: An integers array.
* @return: return any of peek positions.
*/
int findPeak(vector<int> &a) {
int len = a.size();
int start = 0, end = len - 1;
while (start + 1 < end) {
int mid = start + (end - start) / 2;
if (a[mid] > a[mid - 1] ) {
start = mid;
} else {
end = mid;
}
}
if (a[end] > a[start]) return end;
return start;
}
};