描述
你给出一个整数数组(size为n),其具有以下特点:
- 相邻位置的数字是不同的
- A[0] < A[1] 并且 A[n - 2] > A[n - 1]
假定P是峰值的位置则满足A[P] > A[P-1]
且A[P] > A[P+1]
,返回数组中任意一个峰值的位置。
样例
给出数组[1, 2, 1, 3, 4, 5, 7, 6]
返回1
, 即数值 2 所在位置, 或者6
, 即数值 7 所在位置.
挑战
Time complexity O(logN)
思路
看到O(logN)就知道应该是二分查找。感觉这个和找中位数差不多,只是需要每次减少一半的搜索域就可以了。关键是只需要找到一个,所以思路是“这个方向肯定有”(而其他方向也可能有)。
代码
class Solution {
public:
/**
* @param A: An integers array.
* @return: return any of peek positions.
*/
int findPeak(vector<int> &A) {
// write your code here
int start = 0, end = A.size()-1;
int mid = (start+end)/2;
int n=A.size()-1;
while(start <= end && mid >= 1 && mid <= n-2)
{
if(A[mid] > A[mid-1] && A[mid] > A[mid+1])
{
return mid;
}
else if(A[mid] <= A[mid-1])
{
end = mid-1;
}
else
{
start = mid+1;
}
mid = (start+end)/2;
}
return n-1;
}
};