提示:今天学习了关于二分查找法的内容具体如下:
二分法呢其实就是在数组里找一个target,判断这个target在不在这个数组里,如果在的话返回这个数组的所对应元素的下标,如果没在就返回-1。
提示:以下是本篇文章正文内容,下面案例可供参考
一、二分法易错点
大家在写二分法的时候有两点是容易写乱的,第一点就是在写while循环的时候 left是 < right 还是 left <= right 这一点很多人都把握不好有的时候是小于有的时候是小于等于,第二点就是在循环里如果元素大于target的话,我们应该更新右区间,right是等于middle还是等于middle-1
二、不变量
针对以上为两个问题,其实解决方法也很简单就是在循环里坚持对这个区间的一个定义,这样我们才能把握好这两点,我们才能对这些边界做一个理论性的一个分析,而不是死记硬背的记下来。这个区间的定义我们可以理解为不变量,在循环中我们去一段区间、一段区间的去搜索,相当于我们要在这个循环中坚持这个不变量,一开始定义的区间是左闭右闭,在后续的循环中还是要继续坚持左闭右闭的这个原则。
三、左闭右闭的写法
var search = function(a, b) {
// right是数组最后一个数的下标,num[right]在查找范围内,是左闭右闭区间
let m, left = 0, right = a.length - 1;
// 当left=right时,由于a[right]在查找范围内,所以要包括此情况
while (left <= right) {
// 位运算 + 防止大数溢出
m = left + ((right - left) >> 1);
// 如果中间数大于目标值,要把中间数排除查找范围,所以右边界更新为m-1;如果右边界更新为m,那中间数还在下次查找范围内
if (a[m] > b) {
right = m - 1; // 去左面闭区间寻找
} else if (a[m] < b) {
left = m + 1; // 去右面闭区间寻找
} else {
return m;
}
}
return -1;
};
总结
二分法是非常重要的基础算法,为什么很对人迷惑呢?
主要就是对区间的定义没有理解清楚,在循环中没有始终坚持根据查找区间的定义来做边界处理。
区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。