[1,2,3,4,5,6,7,8,9,10]
tip:
验证程序正确性
1.明确变量含义
2.循环不变量
3.调试
1. 闭区间算法 [l,r]
要清楚的一点时,在这个设计思想里面我们是在[l,...,r]范围内找target
当为闭区间时,当l=r的时候区间内是还有值的,当l===r时,比如算到[1]在闭区间那么还有1要计算,所以条件设置为l<=r
因为前提时闭区间,所以循环要维护这个闭区间
function BinarySearch (arr, target) {
const n = arr.length
let l = 0
let r = n - 1
while (l <= r) {
let mid = l + ~~((r - l) / 2)
if (arr[mid] === target) {
return mid
} else if (target > arr[mid]) {
l = mid + 1
} else if (target < arr[mid]) {
r = mid - 1
}
}
return -1
}
2.左闭右开 [l,r)
我们在在[l,...,r)范围找target,同理1的思想
不同的是,当右边为开区间时,当l === r时,[1)区间里面就没有值了
在循环时也要维护左闭右开的设计思想
function BinarySearch (arr, target) {
const n = arr.length
let l = 0
let r = n
while (l < r) {
let mid = l + ~~((r - l) / 2)
if (arr[mid] === target) {
return mid
} else if (target > arr[mid]) {
l = mid + 1
} else if (target < arr[mid]) {
r = mid
}
}
return -1
}