一个有意思的二分题
二分峰值题
https://leetcode.cn/problems/find-peak-element/
这个题以前也见过,我觉得这个题目思路很巧妙,把他记录下来。
简单来讲就是先判断两边元素是不是峰值,如果是直接返回结束,如果不是,那么我们可以知道这个数组的趋势是开始上升,最后下降,所以中间一定会有至少一个峰值,那么我们去看中间元素,如果中间元素不是峰值,那他一定也有对应的趋势,所以我们可以扔掉另一半,如此算下来是logn的做法,非常优秀
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int n=nums.size();
if(n==1)
{
return 0;
}
if(nums[0]>nums[1])
{
return 0;
}
if(nums[n-1]>nums[n-2])
{
return n-1;
}
int l=1,r=n-2,ans=-1;
while(l<=r)
{
int mid=l+((r-l)>>1);
if(nums[mid-1]>nums[mid])
{
r=mid-1;
}
else if(nums[mid+1]>nums[mid])
{
l=mid+1;
}
else
{
ans=mid;
break;
}
}
return ans;
}
};

浙公网安备 33010602011771号