Leetcode 162 寻找峰值(二分)

题目描述:

  峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。

数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。要求时间复杂度为log(N)。

题解:

  log(N)复杂度的算法一般都是要用到二分的,二分的核心是划分条件函数的设计。在这里,题面给出了假设 nums[-1] = nums[n] = -∞。那么nums[0]有一个递增的趋势,

nums[N-1]有一个递减的趋势。定义区间的左端点left,右端点right,如果nums[mid] < nums[mid+1],也就是中点有一个递增的趋势,那么在这个mid可以作为新的left(中点为递增,rigth为递减,那么峰值一定会出现在右区间);

如果nums[mid] > nums[mid+1],中点有一个递减的趋势,那么峰值出现在左区间。

AC代码:

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

原文地址:https://www.cnblogs.com/z1141000271/p/12574743.html