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

我们把符合下列属性的数组 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

猜你喜欢

转载自blog.csdn.net/sphinx1122/article/details/84191841