1. 程式人生 > >【JS】山脈陣列的峰頂索引 #二分查詢

【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