题解 | #寻找峰值#

寻找峰值

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

1、二分法:
时间复杂度o(logn),空间复杂度o(1)
思想:上坡一定有波峰,下坡不一定有波峰
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int findPeakElement (int[] nums) {
        // write code here
   //关键思想:下坡的时候可能找到波峰,但是可能找不到,一直向下走的
  //上坡的时候一定能找到波峰,因为题目给出的是nums[-1] = nums[n] = -∞
        int left = 0;
        int right = nums.length-1;
        while(left<right){
            int mid = left+(right-left)/2;
            //证明右边的路是下坡路,不一定有坡峰
            if(nums[mid]>nums[mid+1]){
                right = mid;
            }
            else{
                //这里是右边的路是上坡路
                left=mid+1;
            }
        }
        return right;
    }
}
2、找最大值
时间复杂度O(n),空间复杂度O(1)
思想:根据题目的意思,两个端点值是-∞(且元素不重复),我只需要一直找最大的值,那么这个值一定是波峰
public int findPeakElement(int[] nums) {
        int idx = 0;
        for (int i = 1; i < nums.length; ++i) {
            if (nums[i] > nums[idx]) {
                idx = i;
            }
        }
        return idx;
    }







全部评论
有相邻元素不相等的条件
1 回复 分享
发布于 2022-05-19 11:35
左闭右闭的情况下,怎样理解while里面是left < right ,而不是left <= right
1 回复 分享
发布于 2022-06-12 16:45
楼主的答案很清晰,有些人不审题的毛病要改改啊
1 回复 分享
发布于 2022-07-21 18:25
[2,3,3,2,3,2,2,1,3]. 这个case 你的第一个答案就会找错,因为上坡只是概率大,不是一定有,他只是优先,因为 3,3就不是山峰,牛客给的验证例子有缺陷
点赞 回复 分享
发布于 2022-03-13 10:29
没毛病,铁子思路清晰得一批
点赞 回复 分享
发布于 2022-03-18 12:54
[1,5,3,3,2] 这个例子你跑跑看,你的结果给出来是3,正确应该是1
点赞 回复 分享
发布于 2022-03-21 23:35
别说了,第一个用例[2,4,1,2,7,8,4],我返回5直接gg了,预期输出1,牛客这做的啥。。。
点赞 回复 分享
发布于 2022-12-22 19:59 浙江
请问为什么必须是mid和mid+1比较,而不能mid-1和mid比较
点赞 回复 分享
发布于 2023-05-15 21:09 江苏
[7,6,5,4,3,4,1],这个案例应该是5,题主的二分查找答案为0
点赞 回复 分享
发布于 06-14 03:40 新疆

相关推荐

28 2 评论
分享
牛客网
牛客企业服务