寻找峰值
思路:
根据一个点处在上下坡,来缩小搜索区间。
class Solution {
public:
int findPeakElement(vector<int>& a) {
int n = a.size();
if(n==1) return 0;
if(n==2) return a[0]>a[1]?0:1;
int l = 0 ,r = (int)a.size()-1;
while(l<=r){
int m = l+(r-l)/2;
if(m==0){
if(a[m]>a[m+1]) return m;
else l = m+1;
}else if(m==n-1){
if(a[m]>a[m-1]) return m;
else r = m-1;
}else{
if(a[m]>a[m-1] && a[m]>a[m+1]) return m;
else if(a[m-1]<a[m] && a[m]<a[m+1]){
l = m+1;
}else{
r = m-1;
}
}
}
return -1;
}
};
参考官方的:
class Solution {
public:
int findPeakElement(vector<int>& nums) {
return search(nums,0,nums.size()-1);
}
int search(vector<int>& nums,int l,int r){
if(l==r) return l;
int mid = l+(r-l)/2;
if(nums[mid]<nums[mid+1])
return search(nums,mid+1,r); //右侧必然存在峰值
return search(nums,l,mid); //左侧必然存在峰值
}
};
改写为迭代:
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 l;
}
};