leetcode 162. 寻找峰值 medium

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/speargod/article/details/98813647

leetcode 162. 寻找峰值   medium          

题目描述:

峰值元素是指其值大于左右相邻值的元素。

给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞。

说明:

你的解法应该是 O(logN) 时间复杂度的。

解题思路:

解法是 O(logN) ,所以用二分来做,而在本例中,我们对二分查找进行一点修改。首先从数组 nums中找到中间的元素 mid。若该元素恰好位于降序序列或者一个局部下降坡度中(通过将 nums[i]与nums[i+1]比较判断),则说明峰值会在本元素的左边。于是,我们将搜索空间缩小为 midmid 的左边(包括其本身),并在左侧子数组上重复上述过程。否则说明峰值会在本元素的右边。于是,我们将搜索空间缩小为 mid的右边,并在右侧子数组上重复上述过程。直到只剩一个元素为止!

代码:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        
        // 必会有一个峰值存在,画下图即知,因为极端情况就是单调增减,而这两种情况的
        // 峰值即为左右两端点。
        int left=0,right=nums.size()-1;
        while(left<right){
            
            int mid=left+(right-left)/2;
            
            //用mid+1 是因为mid是下取整,而循环终止条件是left<right,所以用mid+1 永远不会越界
            //(只有mid=nums.size()-1 才会发生越界,而这要求left=right=mid=nums.size()-1)
            // 所以不然用mid-1 来判断,可能越界
            if(nums[mid]>nums[mid+1]) 
                right=mid;
            else
                left=mid+1;
        }
        
        return left;
        
    }
};

猜你喜欢

转载自blog.csdn.net/speargod/article/details/98813647