你给出一个整数数组(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 所在位置.
思想:此题比较简单,若要实现o(logn)的时间复杂度,则用双指针左右同时遍历即可。
题中条件保证了左右至少各有一个峰值,所以才能使用二分法实现O(log(n))的复杂度,否则只能使用遍历法,时间复杂度为O(n)
仔细想想,是否可以用二分法做,因为A[0] < A[1] 并且 A[n - 2] > A[n - 1],而且相邻位置数字不同,故至少有一端会出现峰值
方法-(双指针):
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=1,end=A.size()-2;
while(start<=end)
{
if(A[start]>A[start-1]&&A[start]>A[start+1])
return start;
else start++;
if(A[end]>A[end-1]&&A[end]>A[end+1])
return end;
else end--;
}
return -1;
}
};
我的代码(二分法):有点不好思考,但确实存在这样一个规律
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=1,end=A.size()-2;
while(start<=end)
{
int mid=start+(end-start)/2;
if(A[mid]>A[mid+1])
{
if(A[mid]>A[mid-1])
return mid;
else end=mid-1;//左侧存在峰值
}
else start=mid+1;//右侧存在峰值
}
return -1;
}
};