LeetCode162. 寻找峰值

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

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

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

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

示例 1:

输入:nums = [1,2,3,1]
输出:2
解释:3 是峰值元素,你的函数应该返回其索引 2。
示例 2:

输入:nums = [1,2,1,3,5,6,4]
输出:1 或 5
解释:你的函数可以返回索引 1,其峰值元素为 2;
或者返回索引 5, 其峰值元素为 6。

提示:

1 <= nums.length <= 1000
-2^31 <= nums[i] <= 2^31 - 1
对于所有有效的 i 都有 nums[i] != nums[i + 1]


解题思路:由于题目要求时间复杂度为O(logn),所以第一时间想到二分法
题目中说明了两个边界为无穷小,这个条件非常重要
当我们使用二分法,进行第一次二分时,如果是峰值元素,则可以直接返回所有号
如果nums[mid-1]>nums[mid]那么在左半端必有峰值元素,右半端同理

这是因为nums[mid-1]>nums[mid],同时左边界为无穷小。此时在nums[0]~nums[mid]中必有峰值元素
就和现实中爬山一样,在nums[mid]端向左爬,是上山,但最终会下到山底,所以必然会有一个山峰

代码如下所示

class Solution {
    
    public int findPeakElement(int[] nums) {
        int n=nums.length;
        //两个端点情况
        if(n==1||nums[0]>nums[1]) return 0;
        if(nums[n-1]>nums[n-2]) return n-1;
        //因为两侧都是谷底,所以在nums数组中比nums[mid]大的一侧的一侧必有山峰
        int l=0,r=nums.length,mid=(l+r)/2;
        while(r>l){
            if(nums[mid]>nums[mid+1]&&nums[mid]>nums[mid-1]){
                return mid;
            }
            if(nums[mid]<nums[mid+1]){
                l=mid;
                mid=(l+r)/2;
                continue;
            }
            if(nums[mid]<nums[mid-1]){
                r=mid;
                mid=(l+r)/2;
                continue;
            }
        } 
        return mid;
    }

}

相关推荐

  1. LeetCode162. 寻找峰值

    2024-03-23 21:58:04       19 阅读
  2. LeetCode每日一题.08(162.寻找峰值)

    2024-03-23 21:58:04       35 阅读
  3. Leetcode 152. 乘积最大子数组和Leetcode 162. 寻找峰值

    2024-03-23 21:58:04       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-23 21:58:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-23 21:58:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-23 21:58:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-23 21:58:04       20 阅读

热门阅读

  1. NAT技术

    NAT技术

    2024-03-23 21:58:04      17 阅读
  2. 【AIGC工具】MonicAi — 可定制的AI学习工具

    2024-03-23 21:58:04       23 阅读
  3. CUDA | 核函数编写的注意事项

    2024-03-23 21:58:04       20 阅读
  4. H12-821_895

    2024-03-23 21:58:04       17 阅读
  5. C#基础第一阶段

    2024-03-23 21:58:04       19 阅读
  6. string c++

    2024-03-23 21:58:04       17 阅读
  7. 剑指offer面试题42 翻转字符顺序 VS 左旋字符串

    2024-03-23 21:58:04       22 阅读
  8. 《桥接模式(极简c++)》

    2024-03-23 21:58:04       16 阅读
  9. dubbo RandomLoadBalance的一点优化

    2024-03-23 21:58:04       16 阅读
  10. 面试算法-43-最长递增子序列

    2024-03-23 21:58:04       19 阅读
  11. 使用VisualStudio集成开发nodejs的addon项目

    2024-03-23 21:58:04       16 阅读