【JS】山脉数组的峰顶索引 #二分查找

本文探讨了如何在特定类型的数组——山脉数组中找到峰值的索引。介绍了三种方法,包括利用内置函数、遍历判断及优化搜索策略,旨在提供高效解决方案。

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

我们把符合下列属性的数组 A 称作山脉:

A.length >= 3
存在 0 < i < A.length - 1
使得 A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1]给定一个确定为山脉的数组,
返回任何满足 A[0] < A[1] < … A[i-1] < A[i] > A[i+1] > … > A[A.length - 1] 的 i 的值。

示例 1:
输入:[0,1,0]
输出:1

示例 2:
输入:[0,2,1,0]
输出:1

提示:
3 <= A.length <= 10000
0 <= A[i] <= 10^6
A 是如上定义的山脉

解法一:

这道题目一开始并没有看懂 -
然后尝试了一下是不是求最大的数索引,然后,就通过了^
步骤如下1找出最大的值,Math.max.apply(Function, Args)
2找出位置,indexOf(string,[fromindex])

var peakIndexInMountainArray = function(A) {    
        var x=Math.max.apply(null,A)
        return A.indexOf(x)
};

32 / 32 个通过测试用例
执行用时:68 ms


解法二:

使用遍历加判断,保留遍历过程中最大那个数,和对应的索引位置。最后返回索引
另外山峰数组是有序的,从低到高再从高到低,所以当遍历的过程中,数值在往下走时就已经可以跳出循环了。

var peakIndexInMountainArray = function(A) {  
    var max=0,pos=0
    for(i in A){
        i=parseInt(i)
        if(A[i]>max){
            max=A[i]
            pos=i
        }
    }  
    return pos;
};

32 / 32 个通过测试用例
执行用时:84 ms

解法三:

也可以从中间开始循环,当左边更大时索引-1,当右边更大那么索引+1

var peakIndexInMountainArray = function(A) {
    var max=Math.max.apply(null,A)
    var len=A.length-1,center=Math.ceil(len/2);
    for(var i=center;i<=len;){
        if(A[i]==max){
            max=i;break;
        }
        if(A[i]>A[i+1] || A[i-1]>A[i]){
            i--
        }else if(A[i]<A[i+1] || A[i-1]<a[i]){
            i++
        }
    }  
    return max;
}

32 / 32 个通过测试用例
执行用时:80 ms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值