我正在嘗試在 javascript 中使用 for 回圈實作二進制搜索,但它在一些測驗用例中失敗了,下面是我的代碼
function binarySearch(arr, val){
let start = 0
let end = arr.length - 1
let middle = Math.floor((start end)/2)
for(let i = start; i<= end; i ){
if(val === arr[middle]) {
return middle
}
if(val < arr[middle]){
end = middle - 1
}
if(val > arr[middle]){
start = middle 1
}
middle = Math.floor((start end)/2)
}
return -1
}
// test case:1 console.log(binarySearch([5, 6, 9, 10, 13, 14, 18, 30, 34, 35, 37, 40, 44, 64, 79, 84, 86, 95, 96, 98, 99], 9))
// test case:2 console.log(binarySearch([1,3,4,5,6,7,8,9, 10], 10))
它通過了第二個測驗用例,但在第一個測驗用例中慘遭失敗。請問有人可以放點燈嗎?
uj5u.com熱心網友回復:
我意識到為什么在這種情況下不使用“for 回圈”。
這是因為在回圈內部,我為“開始”分配了一個新值,但是當您遇到“i”的值保持與先前初始化的“開始”值相同的事實時會出現問題。
同樣發生在,i <= end
我的意思是“i”除了 i 之外沒有被重新分配。我已經意識到在這些情況下最好使用 while 回圈迭代而不是 for 回圈,在這種情況下您需要從回圈內部重新初始化索引。
uj5u.com熱心網友回復:
就像您說的 Nishant 一樣,While 回圈適用于這種情況,因為您應該更新回圈內的 left(start)、right(end) 和 middle 索引的值。
二分查找的迭代實作(Java):
public int binarySearch(int[] array, int target) {
var left = 0;
var right = array.length - 1;
while (left <= right) {
var middle = (left right) / 2;
if (array[middle] == target)
return middle;
if (target < array[middle])
right = middle - 1;
else
left = middle 1;
}
return -1;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318703.html
標籤:javascript 算法 数据结构 二分查找
