二分查找是查找有序的数组中某一元素的方法,是最基础也是最常用的优化方式。
我们刷算法题时,只要题目中的数组是有序的,要求时间复杂度有logn这一项元素,那基本要用到二分查找没差了。
但是,同样要掌握二分查找的递归形式,对简化代码很有帮助。
循环迭代写法
const binarySearch = function (nums, target) {
let l = 0, r = nums.length - 1
while (l <= r) {
let mid = Math.floor((r - l) / 2 + l)
if (nums[mid] > target) {
r = mid - 1;
} else if (nums[mid] < target) {
l = mid + 1;
} else {
return mid;
}
}
return -1
}
递归写法
const binarySearch = function (nums, target) {
function find(l, r, nums, target) {
let mid = Math.floor((r - l) / 2 + l);
if (l > r) {
return -1
}
if (nums[mid] === target) {
return mid;
} else if (nums[mid] > target) {
return find(l, mid - 1, nums, target);
} else {
return find(mid + 1, r, nums, target);
}
}
return find(0, nums.length - 1, nums, target);
}
需要注意的点
1.边界值的判断
也就是while中,左边界与右边界的关系。基本上,当数组可以有重复的值时,while循环中就是left <= right,反之则是left < right。
2.在求中间值时,这样写(right - left) / 2 + left,而不是(left + right) / 2。这样可以防止超出数字的安全范围。
记录记录!