【JS】山脈陣列的峰頂索引 #二分查詢
阿新 • • 發佈:2018-11-21
我們把符合下列屬性的陣列 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