题解 | 寻找峰值 这里的二分很有意思 找mid邻近比mid大的元素

寻找峰值

https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int findPeakElement(vector<int>& nums) {
        // write code here
        //只想到用两个条件去限制 遍历整个数组 为o(n)
        //不是白给的这个边界为最小值的条件 这说明一定有峰 一直往高处走找到那个最高的就行了
        //这个逻辑没有问题,因为各个元素都不相等,所以这个元素要么比他旁边的大要么比他旁边的小,找到这个相对最大的元素,尽管他的位置可能是在两侧,但是因为右侧数值为负无穷,所以它也是峰值
        //看到logn想到二分查找
        int left=0,right=nums.size()-1;
        int mid=0;
        while(right>=left){
            mid=(left+right)/2;
           /*
           if(nums[left]>nums[mid])right=mid-1;
            else if(nums[right]>nums[mid])left=mid+1;
            else 
            这个逻辑有问题 应该找的是相对mid的那一片区域
           */ 
            if(nums[mid+1]>nums[mid])left=mid+1;
            else if(nums[mid-1]>nums[mid])right=mid-1;
            else return mid;
        }
        return mid;

    }
};

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务