阅读 50

leetcode 寻找峰值 中等

 

 

题目要求复杂度 logn,很容易就想到二分了。

然后,二分怎么移动 l,r 呢?其实也挺容易猜到的:如果 nums[mid] < nums[mid + 1],l = mid + 1,反之 r = mid - 1;

正确性说明:如果 nums[mid] < nums[mid + 1],那么右边一定是有峰值的,最坏情况也就是峰值在 nums.size() - 1 这个位置,由于题目说了 nums[n] 看做 -∞,所以必有答案;

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int l = 0, r = nums.size() - 1;
        while(l <= r) {
            int mid = (l + r) >> 1;
            bool tag1 = (mid == 0) || (nums[mid] > nums[mid - 1]);
            bool tag2 = (mid == nums.size() - 1) || (nums[mid] > nums[mid + 1]);
            if(tag1 && tag2) return mid;
            if(nums[mid] < nums[mid + 1]) {
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }
        return -1;
    }
};

 

原文:https://www.cnblogs.com/rookie-acmer/p/15302822.html

文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐