【leetcode】162. 寻找峰值(find-peak-element)(二分)[中等]

215 篇文章 0 订阅
14 篇文章 0 订阅
本文解析了LeetCode题目Find Peak Element,介绍了如何利用二分搜索算法在O(logn)的时间复杂度内找出数组中的峰值元素。通过递归和比较中间元素与其左右邻居的关系,逐步缩小搜索范围,最终确定峰值索引。
摘要由CSDN通过智能技术生成

链接

https://leetcode-cn.com/problems/find-peak-element/

耗时

解题:19 min
题解:7 min

题意

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

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

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

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

提示:

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

思路

因为nums[-1] = nums[n] = -∞,所以对于每个位置,其上升方向的一侧必有峰,即 nums[i] < nums[i+1],i+1 一侧一定有峰,nums[i] < nums[i-1],i-1 一侧一定有峰。二分之后再在上升区间二分即可。

时间复杂度: O ( l o g n ) O(logn) O(logn)

AC代码

class Solution {
    public int findPeakElement(int[] nums) {
        int n = nums.length;
        int s = 0, t = n;
        while(s < t) {
            int m = (s+t)>>1;
            if((m == 0 || nums[m] > nums[m-1]) && (m == n-1 || nums[m] > nums[m+1])) {
                return m;
            }
            else if(m == 0 || (m+1 < n && nums[m] < nums[m+1])) s = m+1;
            else t = m;
        }
        return s;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值