题目描述

方法1——遍历法
遍历nums数组,寻找峰值
int findPeakElement(vector<int>& nums) {
int n=nums.size();
if(n==1||nums[0]>nums[1]) return 0;
for(int i=1;i<n-1;++i){
if(nums[i]>nums[i-1]&&nums[i]>nums[i+1]) return i;
}
int res;
if(nums[n-1]>nums[n-2]) return n-1;
return -1;
}
时间复杂度O(n)
方法2——二分法
int findPeakElement(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
//二分法
while(left < right){
int mid = (left + right) / 2;
//右边是往下,不一定有坡峰
if(nums[mid] > nums[mid + 1])
right = mid;
//右边是往上,一定能找到波峰
else
left = mid + 1;
}
//其中一个波峰
return right;
}
由于left满足nums[left]>nums[left-1],right满足nums[right]>nums[right+1],因此当left==right(记作idx)时。idx一定满足nums[idx]>nums[idx-1]&&nums[idx]>nums[idx+1],idx对应峰值下标。
时间复杂度O(logn)