题解 | #寻找峰值#

寻找峰值

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

描述

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。

  1. 峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
  2. 假设 nums[-1] = nums[n] = Integer.MIN_VALUE
  3. 对于所有有效的 i 都有 nums[i] != nums[i + 1]

数据范围:

  1. 1<n<=2x10^5
  2. -2^31<=nums[i]<=2^31-1

思路1:寻找最大值

省略

思路2:遍历左右比较

思路1和思路2,最差的情况坡峰在最后一个值,时间复杂度为O(n)

public class Solution {
    public int findPeakElement (int[] nums) {
        int left = Integer.MIN_VALUE;
        for(int i = 0; i < nums.length - 1; i++) {
            if(nums[i] > left && nums[i] > nums[i+1]) {
                return i;
            }
            left = nums[i];
        }
        return nums.length - 1;
    }
}

思路3:二分法

下坡不一定有坡峰,上坡一定有坡峰,不断压缩区间。时间复杂度为O(logn)

public class Solution {
    public int findPeakElement (int[] nums) {
        int i = 0;
        int j = nums.length - 1;
        while(i < j) {
            int mid = i + (j - i >> 1);
            if(nums[mid] < nums[mid + 1]) {
                //mid小于mid+1,说明mid不可能是坡峰,可以跳过
                i = mid + 1;
            } else {
                //mid>=mid+1,mid有可能是坡峰,不能跳过
                j = mid;
            }
        }
        return i;
    }
}
全部评论

相关推荐

程序员牛肉:1.大头肯定是院校问题,这个没啥说的。 2.虽然有实习,但是实习的内容太水了,在公司待了七个月的时间,看起来就只做了jwt和接入redis。爬取新闻,数据导入。这几个需求值得你做七个月吗?这不就是三四个月的工作量吗?我要是面试官的话真心会认为你能力不太行。所以既然有实习了,一定要好好写,像是Swagger这种东西是真没必要写上去,就拉一个包的事情。 3.我个人觉得话,在校生不要把自己当社招看,除非你的项目是特别牛逼,特别有名的含金量,否则不要写这种密密麻麻的一串子工作职责。你的项目只有一个作用,就是供面试官从中来抽取八股对你进行拷打。 但是你现在这个看不来什么技术点,可以改一下,详细表述一下你用什么技术实现了什么功能,在实现这个功能的过程中,你解决了什么难题。
点赞 评论 收藏
分享
牛客59349152...:没有让你做出个前后端页面,然后又不要你就知足了吧😂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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