首页 > 其他分享 >二分查找的要点,区间能缩小为一个点

二分查找的要点,区间能缩小为一个点

时间:2023-05-20 14:44:42浏览次数:35  
标签:二分 right 一个点 int mid 查找 区间 left

二分查找的要点就是让目标区间不断缩小直至为一个点。

这同样是一些分治算法的目标,比如快速排序,我们的目标是区间缩小为一个点,如果你不能理解这个问题,那么通常会在剩余最后两三个数的时候混乱。

我们在二分查找的时候,要不断通过left right mid的更新去达到我们最终目标;

如果我们的mid计算方式为mid = left + (right - left) / 2;

那么为了能使目标区间最终能缩小为一个点,我们在更新left的时候,至少要让left前进一步,也就是left = mid + 1。

为什么?如果更新算法是left = mid,那么当left + 1 = right;时,会进入死循环,因为相邻两个数字相加除以2得到的mid=left,这时如果更新left=mid,就会进入死循环。

而right则没有这个问题,更新right时,无论是right = mid,还是right = mid - 1,区间最终都会缩小为一个点。

如果因为题目限制,我们必须要让left=mid去更新,那么我们此时必须通过其他的mid计算方式,去避免这个问题。

 

我们来看两个二分查找的经典题目。

    int guessNumber(int n) {
        int left = 1, right = n;
        while (left < right) { // 循环直至区间左右端点相同
            int mid = left + (right - left) / 2; // 防止计算时溢出
            if (guess(mid) <= 0) {
                right = mid; // 答案在区间 [left, mid] 中
            } else {
                left = mid + 1; // 答案在区间 [mid+1, right] 中
            }
        }
        // 此时有 left == right,区间缩为一个点,即为答案
        return left;
    }

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/guess-number-higher-or-lower/solution/cai-shu-zi-da-xiao-by-leetcode-solution-qdzu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    int firstBadVersion(int n) {
        int left = 1, right = n;
        while (left < right) { // 循环直至区间左右端点相同
            int mid = left + (right - left) / 2; // 防止计算时溢出
            if (isBadVersion(mid)) {
                right = mid; // 答案在区间 [left, mid] 中
            } else {
                left = mid + 1; // 答案在区间 [mid+1, right] 中
            }
        }
        // 此时有 left == right,区间缩为一个点,即为答案
        return left;
    }

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/first-bad-version/solution/di-yi-ge-cuo-wu-de-ban-ben-by-leetcode-s-pf8h/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:二分,right,一个点,int,mid,查找,区间,left
From: https://www.cnblogs.com/linukey/p/17417205.html

相关文章

  • 类 方法中实现查找某元素是否在数组中的操作
    publicclassImoocStudent{publicbooleancontains(int[]arr,intelement){booleanresult=false;for(intvalue:arr){if(value==element){result=true;break;}......
  • 线性查找和二分查找
    线性查找'''列表线性查找线性查找就是从列表起始位置一次查询,直到查询到目标值,或者遍历整个列表完毕才结算查找过程线性查找复杂度O(n),比较慢'''fromcall_timeimport*@call_timedefliner_search(list,value):forindex,elementinenumerate(list):......
  • Codeforces 1832F - Zombies(wqs 二分)
    等价于最大化\(n\)对区间的交集之和。而对于每个\([l_i,r_i)\)我们肯定会选择与其交集最大的\([p,p+m)\)与之匹配,所以我们只用对\(k\)个区间进行决策即可。首先先发现一个东西:存在一种最优解,使得对于每个选择的区间\([p,p+m)\),要么有\(p=l_i\),要么有\(p+m=r_i\),也就是......
  • MS SQL Server 排查阻塞和查找被锁语句
    --方法1SELECT'资源类型'=t1.resource_type,'来源数据库'=CONVERT(CHAR(25),DB_NAME(resource_database_id)),'数据库中与资源相关联的实体的ID'=t1.resource_associated_entity_id,'锁模式'=t1.request_mode, --锁的模式:S-共享锁,U-更新锁,X-排他锁,IS/IU/IX-意向......
  • [D盾_web查杀]网站后面查找工具
    本文转载自:[D盾_web查杀]网站后面查找工具更多内容请访问钻芒博客:https://www.zuanmang.net在一定程度上还是有点用的,从网上下载来的源码模板可能并没那么干净。官网:http://www.d99net.net/官网最新版本下载(2019-6-29)『D盾_防火墙』版本:v2.1.4.9:http://www.d99net.net/down......
  • 华为OD机试 查找单入口空闲区域
    华为OD机试【4大宝典】再次上新题!①Python解华为机试题:https://dream.blog.csdn.net/article/details/129221789②C++解华为机试题:https://dream.blog.csdn.net/article/details/129472919③Java解华为机试题:https://dream.blog.csdn.net/article/details/129652513④......
  • redhat7查找已接网线但是还未配置IP的网卡接口
    方法一:nmcli输出中参数WIRED-PROPERTIES.CARRIER为on即为接网线网卡#nmclideviceshow|grep-i-E"device|carrier"GENERAL.DEVICE:                        ens224WIRED-PROPERTIES.CARRIER:              on如下命令将输出内......
  • 查找文本字符串,并返回所在行数据
    #include<iostream>#include<string>#include<Windows.h>#include<fstream>#include<sstream>#include<signal.h>#include<io.h>#include<vector>#include<process.h>#include<cstdio>#include<as......
  • js 查找数组中倒数第二最大值
    constarr=[1,5,3,7,9,21,33,18,12,44,43,22,55,66,65]constresult=arr=>{//存储最小值letminMax=0//存储最大值letmax=0arr.forEach(item=>{if(item>max){if(minMax<max){minMax=max......
  • Django authenticate() 函数查找不到与提交的用户名和密码匹配的用户,则会返回 None。
    在你的userAPP下面添加一个utils.py文件classUsernameMobileBackend(ModelBackend):defauthenticate(self,request,username=None,password=None,**kwargs):"""重写人做方法"""#使用账号查询运河#如果用户名查询到用......