易错点
二分查找在代码实现时,while的判断条件和left、right的边界设置是非常易错的。而他们的设置主要取决于区间的设定,一般可以分为左闭右闭[]
和左闭右开[)
写法
代码实现
对应力扣704
1 左闭右闭实现
var search1 = function (nums, target) {
let left = 0
let right = nums.length - 1
// 对于左闭右闭区间,区间中的所有值都可以取到,[1,1]显然合法
while (left <= right) {
let middle = Math.floor((left + right) / 2)
if (target < nums[middle]) {
// 对于左闭右闭区间,区间中的所有值都可以取到,既然target < nums[middle],所以target不可能等于nums[middle],所以下一个搜索区间的右边界就得是nums[middle - 1]
right = middle - 1
} else if (target > nums[middle]) {
// 同理
left = middle + 1
} else {
return middle
}
}
return -1
}
2 左闭右开实现
var search2 = function (nums, target) {
let left = 0
let right = nums.length
// 对于左闭右开区间,区间中最右面的值取不到,[1,1)显然不合法,所以左不能等于右
while (left < right) {
let middle = Math.floor((left + right) / 2)
if (target < nums[middle]) {
// 对于左闭右开区间,区间中最右面的值取不到,所以下一个搜索区间的右边界就得是nums[middle],如果是nums[middle - 1],那下一个搜索区间在搜索时就会少一个值
right = middle
} else if (target > nums[middle]) {
left = middle + 1
} else {
return middle
}
}
return -1
}