二分查找法

提示:今天学习了关于二分查找法的内容具体如下:

二分法呢其实就是在数组里找一个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;
};

总结

二分法是非常重要的基础算法,为什么很对人迷惑呢?

主要就是对区间的定义没有理解清楚,在循环中没有始终坚持根据查找区间的定义来做边界处理。

区间的定义就是不变量,那么在循环中坚持根据查找区间的定义来做边界处理,就是循环不变量规则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值