首页 > 其他分享 >【代码练习】一道题带你掌握二分查找

【代码练习】一道题带你掌握二分查找

时间:2023-05-21 11:07:58浏览次数:32  
标签:二分 right nums int 题带 middle 查找 左闭 left

二分查找

image.png

解析:

思路一:暴力解法,直接遍历,从头开始查找,如果找到直接返回下标,找不到返回-1。

class Solution {
public:
    int search(vector<int>& nums, int target) {
        for(int i = 0; i < nums.size(); i++)
        {
            if(nums[i] == target)
                return i;
        }
        return -1;
    }
};

思路二:二分查找;

使用二分查找的前提条件是:

1.数组为有序数组;

2.数组中无重复元素(一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的)。

二分查找中,最容易搞混的两点为:

1.while循环里面的条件应该是while(left < right)还是while(left <= right)

2.right再次赋值的时候应该是right = middle还是right = middle - 1

二分查找分析:

首先我们要对区间的定义进行明确,即确定这个区间是左闭右闭([left,right],区间包含leftright)还是左闭右开([left,right),区间包含left,但是不包含right),一般情况下都是这两种情况;然后针对不同区间的定义,进行边界条件的处理(即while循环条件)。

对于区间的定义不一样,是直接影响边界条件的处理的(即while循环条件)。

第一种情况:左闭右闭

当我们使用左闭右闭区间的时候,while(left <= right)是合法的,即leftright能够满足这个条件;

right再次赋值时我们已经判断middle不等于target了,要控制好边界条件,所以要让right = middle-1;当我们写成right = middle时,区间不明确,边界处理的不对,会出问题;left再次赋值时,也不能等于middle,更新右区间里的左边界。

image.png

左闭右闭代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int right = nums.size() - 1; //左闭右闭要包含right,所以right = nums.size() - 1
        int left = 0;
        while(left <= right) //合法情况
        {
            int middle = (left + right) / 2;
            if(nums[middle] > target)
                right = middle - 1;//更新左区间里的右边界
            else if(nums[middle] < target)
                left = middle + 1;//更新右区间里的左边界
            else
                return middle;
        }
        return -1;
    }
};

第二种情况:左闭右开

左闭右开区间,left不能和right相等,所以循环条件应该是while(left < right),根据区间的定义来查询,因为右开不包含right,所以right = middle,更新左区间里的右边界,left更新的时候仍然是left = middle + 1

image.png

左闭右开代码如下:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int right = nums.size();//左闭右开不包含right,所以right = nums.size()
        int left = 0;
        while(left < right) //不能加等于
        {
            int middle = (left + right) / 2;
            if(nums[middle] > target)
                right = middle;//更新左区间里的右边界
            else if(nums[middle] < target)
                left = middle + 1;//更新右区间里的左边界
            else
                return middle;
        }
        return -1;
    }
};

总结:

左闭右闭区间时,while的循环条件为left <= right,且right = middle -1

左闭右开区间时,while的循环条件为left < right,且right = middle

两个区间的left都是left = middle + 1

标签:二分,right,nums,int,题带,middle,查找,左闭,left
From: https://blog.51cto.com/u_15562309/6318724

相关文章

  • 【代码随想录算法训练营第一天】704. 二分查找、27. 移除元素
    Day1-数组Leetcode704二分查找初解已经不记得二分查找了,遍历找O(n)其实也过了,只是借此复习一下二分,确实快很多。二分的前提条件题目里也都明示了:无重复,(从小到大)排序。我没有用到这个条件,自然时间复杂度高于最优解。看完解答我再看了一眼题目的标题,才知道是考BinarySearch嗯......
  • 基于python实现-根据Excel表格指定的UniqueKey的顺序-到另一个参考表格中查找-补全与
    今天笔者在整理一份数据时,有这样一个需求,已知有多个ID是UniqueKey,每一个UniqueKey及与它相关的数据为一行,存放于Excel表格行中但他们相关的数据可能有误,而另一个表格Excel-02中的数据没有问题,但是UniqueKey顺序与第一个表格不一样现在主要是要修改第一个表格的数据,当然可以使用......
  • 二分查找的要点,区间能缩小为一个点
    二分查找的要点就是让目标区间不断缩小直至为一个点。这同样是一些分治算法的目标,比如快速排序,我们的目标是区间缩小为一个点,如果你不能理解这个问题,那么通常会在剩余最后两三个数的时候混乱。我们在二分查找的时候,要不断通过leftrightmid的更新去达到我们最终目标;如果我们的......
  • 类 方法中实现查找某元素是否在数组中的操作
    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如下命令将输出内......