二分查找
不知道大家有没有看过《超级无敌奖门人》的综艺,里面有一个和这个题目很相似的游戏:从1~100里面说一个数字,说中了数字后气球爆炸,没说中的话数字范围收缩。
这个题目的关键解法也是让数字范围收缩,效率最快的收缩方法是:数字范围收缩成一半。如下图,为了找target=2,数字范围不断减半。
左闭右闭与左闭右开
二分查找的算法并不难,但是一开始做的时候边界问题处理起来比较麻烦。解决办法是确定数组两边的开闭,即遍历的时候是否包括数组左右两边的数字。网上的算法都是左闭右闭或者左闭右开的。我们一般写一个数据的循环遍历就是左闭右开的:
const array = [1, 2, 3, 4, 5];
for (let i = 0; i < array.length; i++) {
// 数组范围包括0但不包括array.length,即范围是[0, array.length)
}
实现代码:
var search = function(nums, target) {
// right是数组最后一个数的