leetcode-162寻找峰值

这篇博客介绍了如何利用二分查找算法在O(logn)的时间复杂度内解决LeetCode上的寻找峰值元素问题。文章详细分析了二分查找过程中针对峰值元素的判断条件,并给出了相应的Java代码实现。然而,该算法在实际运行中出现了时间效率和内存占用方面的问题,需要进一步优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode刷题

162. 寻找峰值
题目

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

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

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

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

nums[i] != nums[i + 1]

分析

本文的问题是找到任何一个峰值即可。所以使用二分法需要判断哪部分区域存在峰值。

对于nums[mid],存在两种可能

  1. mid为峰值点,直接返回即可

  2. mid不为峰值点,即两侧一个大于nums[mid],一个小于nums[mid]

    针对于上升的一侧,如果往上升方向一直升序,则终点为峰值;如果出现第一个降序的转折点,则那个点为峰值点

    所以mid上升方向一定会存在峰值点

代码
public int findPeakElement(int[] nums) {
    if (nums.length==1)
        return 0;
    if (nums.length==2){
        return nums[1]>nums[0] ? 1 : 0;
    }
    int left=0;
    int right = nums.length-1;
    int mid;
    while(left<=right){
        mid = (left + right) / 2;
        if ((mid==0 && nums[mid]>nums[mid+1]) || (mid==nums.length-1 && nums[mid]>nums[nums.length-2]) || ( mid>0 && mid<nums.length-1 && nums[mid]>nums[mid-1] && nums[mid]>nums[mid+1])){
            return mid;
        }
        else if (nums[mid+1]>nums[mid]){
            left = mid+1;
        }
        else{
            right = mid-1;
        }
    }
    return -1;
}
结果

时间超过100.00%

内存超过81.78%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值