具体思想:
暴力迭代可做,二分也可;
本质上是找一个递增序列的最后一个位置;
关于二分的问题;
二分这里宫水三叶做了很详细的证明,必须保证:
- 该题目必定有解,即使单调序列,最后一个元素即为解元素;
- 二分不会跳过解;
判断逻辑为, n u m s [ m i d ] > n u m s [ m i d + 1 ] nums[mid]>nums[mid+1] nums[mid]>nums[mid+1]是否成立,成立则说明mid可能是峰值元素,即递增序列的右边界;
如果不成立,最差如果是单调序列,也会保证有解,因此二分成立;
具体代码:
暴力方法:
class Solution {
public:
int findPeakElement(vector<int>& nums) {
if(nums.size()==1)
return 0;
for(int i=0;i<nums.size();i++){
if(i==0&&nums[i]>nums[i+1]){
return i;
}
if(i+1<nums.size()&&nums[i+1]<nums[i]){
return i;
}
}
return nums.size()-1;
}
};
二分方法:
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+1]>nums[mid]){
l=mid+1;
}else{
r=mid;
}
}
return l;
}
};