解法一 O(n)
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int n=nums.size();
for(int i=1;i<n;i++){
if(nums[i-1]>nums[i]) return i-1;
}
return n-1;
}
};
解法二 O(log n)
这道题用的是左闭右闭:
所以初始:int left = 0, right = nums.size() - 1; 数列左右两端都可能成为peak
nums[mid]<nums[mid+1] --> mid绝对不是peak所以left=mid+1 (左闭)
mums[mid]>=nums[mid+1] --> mid还可能是peak所以right=mid (右闭)
最后while condition是根据left, right如何重新定值决定的。
如果用left=mid+1,right=mid,就用left<right
如果用left=mid+1,right=mid-1,就用left<=right
所以这里用left<right。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int l=0,r=nums.size()-1;
while(l<r){
int mid = l+(r-l)/2;
if(nums[mid]<nums[mid+1]) l=mid+1;
else r=mid;
}
return r;
}
};