一个有意思的二分题

二分峰值题
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;
    }
};
posted @ 2026-02-27 16:37  Lambda_L  阅读(4)  评论(0)    收藏  举报