BM19. [寻找峰值]

alt

https://www.nowcoder.com/exam/oj?tab=%E7%AE%97%E6%B3%95%E7%AF%87&topicId=295

BM19. 寻找峰值

https://www.nowcoder.com/practice/fcf87540c4f347bcb4cf720b5b350c76?tpId=295&sfm=github&channel=nowcoder

题目主要信息:

  • 给定一个长度为n的数组,返回其中任何一个峰值的索引
  • 峰值元素是指其值严格大于左右相邻值的元素
  • 数组两个边界可以看成是最小,
  • 峰值不存在平的情况,即相邻元素不会相等
  • 时间复杂度需要在以内

具体思路:

因为数组边界看成最小值,因此只要不断地往高处走,一定会有波峰,最大值两边一定比它小。那可以考虑二分查找

  • step 1:二分查找首先从数组首尾开始,每次取中间值,直到首尾相遇。
  • step 2:如果中间值的元素大于它右边的元素,说明往右是向下,我们不一定会遇到波峰,但是那就往左收缩区间。
  • step 3:如果中间值大于右边的元素,说明此时往右是向上,向上一定能有波峰,那我们往右收缩区间。
  • step 4:最后区间收尾相遇的点一定就是波峰。

具体过程可以参考下列图示:
alt

代码实现:

class Solution {
public:
    int findPeakElement(vector<int>& nums) {
        int left = 0;
        int right = nums.size() - 1;
        while(left < right){ //二分法
            int mid = (left + right) / 2;
            if(nums[mid] > nums[mid + 1])//右边是往下,不一定有坡峰
                right = mid;
            else//右边是往上,一定能找到波峰
                left = mid + 1;
        }
        return right; //其中一个波峰
    }
};

复杂度分析:

  • 时间复杂度:,二分法最坏情况为
  • 空间复杂度:,无额外空间使用

alt

#面经##题解##面试题目#
全部评论

相关推荐

扭转乾坤_:现在企业都是学华为,一直通过丢池子里,最后捞
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务