小小总结之二分查找三种情况

news2024/11/20 23:34:13

小小总结之二分查找三种情况



二分查找主要难点在于:

  1. 起始条件 left,right的取值,一般若闭合区间,则0, length(nums)。如果涉及边界位置代入计算,则0,length(nums)。
  2. 循环条件,第一要能够避免死循环,第二要看保留值(保留边界)问题,left <= right 无值保留,left < right则会剩下left = right一个位置,如果left + 1 < right 则会剩下left, right (right = left + 1)两个位置。
  3. 向左向右查找区间:如果是需要保留当前mid作为边界则赋值为mid,否则相应进行+1、-1操作;另外注意避免死循环问题即可,根据具体来定是否进行+1、-1操作。



First:

原题链接:

704. 二分查找 - 力扣(LeetCode)

image-20240404202751823

int search(int* nums, int numsSize, int target) {
    int left = 0, right = numsSize - 1;
    while (left <= right) {
        int mid = left + ((right - left) >> 1);
        if (nums[mid] == target) {
            while (mid > 0 && nums[mid-1] == target) {
                mid--;
            }
            return mid;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return -1;
}

简单的题,题目直接告诉二分查找,并且让搜索是否存在固定值,即:等于x的下标这一情况,直接经典模板,三种比较结果分开列。

边界问题:在查找到目标值时,我们需要进行简单的处理:目标值是否重复?如果不确定的情况下,我们就需要进行查找:

        if (nums[mid] == target) {
            while (mid > 0 && nums[mid-1] == target) {
                mid--;
            }
            return mid;

while循环的条件设置为:边界+判断数组的值是否与目标相同,内部为下标左移或右移,当查找到了,就return下标的值即可。



Second:

原题链接:

35. 搜索插入位置 - 力扣(LeetCode)

image-20240404202821100

int searchInsert(int* nums, int numsSize, int target) {
    int left=0,right=numsSize-1;
    int ans=numsSize;
    while(left<=right){
        int mid=left+((right-left)>>1);
        if(nums[mid]<target){
            left=mid+1;
        }
        else {
            ans=mid;
            right=mid-1;
        }
    }
    return ans;
}

返回按顺序插入的位置,即:大于等于x的最小下标。

我们这个时候就可以想想,

当左边界收缩的时候,对我们的结果有影响吗?

没有,因为我们要求的是最大的下标,那么我们只有在右边界收缩的时候才会影响我们的结果,

所以我们的用一个答案变量保存一下我们的mid,再进行收缩,

那么当右边界收缩的时候,mid的结果大于目标,所以就保证了这个数据一定大于等于我们目标值,插入的时候就需要插入到这里。我们返回答案变量即可。

为什么继续查找分别left需要+1,而right不再-1

从起始条件可以看出,每次二分查找的区间为[left, right),即区间左闭右开。
因此在target与nums[mid]进行比较时,左侧区间和右侧区间分别改变为了[left, mid)和[mid + 1, right),同样是确保每次mid处的元素不会重复拿出来进行比较(防止死循环)。



Third:

原题链接:

69. x 的平方根 - 力扣(LeetCode)

image-20240404202837711

int mySqrt(int x) {
    long long left = 0, right = 10000000;
    long long ans = 0;
    while (left <= right) {
        long long mid = left + ((right - left) >> 1);
        if (mid * mid <= x) {
            ans = mid;
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return (int)ans;
}

这里需要我们理解一下,找平方根,并且保留整数部分,什么意思呢,也就是结果必定小于等于真实的情况,也就是:小于等于x的最大下标。

我们在这里,返回的是平方根,所以我们直接让mid的积<=x就可以啦,我们回顾一下上一题,也就是说我们需要返回的是左边界的收缩前的结果。



Fourth:

原题链接:

367. 有效的完全平方数 - 力扣(LeetCode)

image-20240404202851808

bool isPerfectSquare(int num) {
    long long left=0,right=num;
    while(left<=right){
        long long mid=left+((right-left)>>1);
        if(mid*mid<num){
            left=mid+1;
        }
        else if(mid*mid>num){
            right=mid-1;
        }
        else return 1;
    }
    return 0;
}

返回是否存在,也是让我们进行查找,如果查找到了那就是存在,未查找到那就是不存在,理论上是第一种情况。

但是我在尝试的时候发现:

这个题可以用上面三号的代码,

也可以将<=变成小于然后再将ans放在right区;

或者就如这里所示,直接分开三个区段。(即判断的应该的类型)

这里发现他可以用三种情况的代码来实现,有点不知道为什么。

目前对于三种方法理解: = 在哪个区间,就 r u t u r n 哪里的值(根据题意改变)。 目前对于三种方法理解:=在哪个区间,就ruturn哪里的值(根据题意改变)。 目前对于三种方法理解:=在哪个区间,就ruturn哪里的值(根据题意改变)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1572644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最优乘车

题目描述 H 城是一个旅游胜地&#xff0c;每年都有成千上万的人前来观光。为方便游客&#xff0c;巴士公司在各个旅游景点及宾馆&#xff0c;饭店等地都设置了巴士站并开通了一些单程巴上线路。每条单程巴士线路从某个巴士站出发&#xff0c;依次途经若干个巴士站&#xff0c;…

网络网络层之(3)IPv6地址

网络网络层之(3)IPv6协议 Author: Once Day Date: 2024年4月2日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文档可参考专栏&#xff1a;通信网络技术_Once-Day的…

JQuery(一)---【JQuery简介、安装、初步使用、各种事件】

零.前言 在学习JQuery前&#xff0c;您需要具备以下知识&#xff1a; HTML相关知识(DOM)CSS相关知识JavaScript相关知识 一.JQuery 1.1JQuery简介 JQuery是一个JavaScript的“函数库”&#xff0c;不是JavaScript的一个框架&#xff0c;与“VUE、REACT”有本质区别&#x…

Java栈和队列的实现

目录 一.栈(Stack) 1.1栈的概念 1.2栈的实现及模拟 二.队列(Queue) 2.1队列的概念 2.2队列的实现及模拟 2.3循环队列 2.4双端队列&#xff08;Deque&#xff09; 一.栈(Stack) 1.1栈的概念 栈:一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作…

【详细讲解0基础如何进入IT行业】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

【HTML】常用CSS属性

文章目录 前言1、字体和文本属性2、边距和填充3、border边框4、列表属性 前言 上一篇我们学习了CSS扩展选择器以及它的继承性&#xff0c;对于页面元素样式设置相信大家都不陌生了。 这一篇我们就来看看具体都有哪些样式可以设置&#xff1f;又该如何设置&#xff1f; 喜欢的【…

爬虫 新闻网站 以湖南法治报为例(含详细注释,控制台版) V2.0 升级自定义查询关键词、时间段

目标网站&#xff1a;湖南法治报 爬取目的&#xff1a;为了获取某一地区更全面的在湖南法治报已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&#xff0c;csv&#xff…

Tailwind 4.0 即将到来:前端开发的“速度与激情”

随着前端开发技术的不断进步&#xff0c;我们每天都在寻找更快、更简洁的解决方案来提升我们的开发效率和用户体验。今天&#xff0c;我要为大家介绍一项令人振奋的新技术进展——Tailwind 4.0的来临&#xff01; 对于经常使用Tailwind的朋友们来说&#xff0c;这个消息无疑是激…

java 常见API(Objects)

定义 API就是别人定义好的工具类和工具包目的&#xff1a;避免重复造轮子&#xff0c;提升开发效率&#xff0c;更加专注于实现业务逻辑 Object 类 object类是所有类的祖宗类&#xff0c;所有的类型都是可以使用Object的方法的 最常见的三个方法&#xff1a; toString:print就会…

蓝桥杯每日一题:约数个数(质因数)

题目描述&#xff1a; 输入 n 个整数&#xff0c;依次输出每个数的约数的个数。 输入格式 第一行包含整数 n。 第二行包含 n 个整数 ai。 输出格式 共 n 行&#xff0c;按顺序每行输出一个给定整数的约数的个数。 数据范围 1≤n≤1000, 1≤ai≤10^9 输入样例&#xff…

coreldraw是什么软件?最新中文2024版本cdr有哪些功能

CorelDRAW&#xff0c;通常也被称为CDR&#xff0c;是由加拿大Corel公司出品的一款平面设计软件。该软件以其强大的矢量图形制作和排版功能而著称&#xff0c;主要面向绘图设计师和印刷输出人员。 CorelDRAW提供了丰富的绘图工具&#xff0c;包括圆形、矩形、多边形、方格、螺…

FJSP:小龙虾优化算法(Crayfsh optimization algorithm,COA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码

一、柔性作业车间调度问题 柔性作业车间调度问题&#xff08;Flexible Job Shop Scheduling Problem&#xff0c;FJSP&#xff09;&#xff0c;是一种经典的组合优化问题。在FJSP问题中&#xff0c;有多个作业需要在多个机器上进行加工&#xff0c;每个作业由一系列工序组成&a…

Linux-线程知识点

目录 线程与进程区别pthread库接口介绍pthread_createpthread_self和syscall(SYS_gettid);pthread_equal测试主线程的栈空间大概是多大pthread_setname_nppthread_exitpthread_join为什么要连接退出的线程 pthread_detach 线程与进程区别 进程是一个动态的实体&#xff0c;有自…

java之static详细总结

static也叫静态&#xff0c;可以修饰成员变量、成员方法。 成员变量 按照有无static分为两种&#xff1a; 类变量&#xff1a;static修饰&#xff0c;属于类&#xff0c;与类一起加载一次&#xff0c;在内存中只有一份&#xff0c;会被类的全部对象共享实例变量&#xff08;…

【C++ STL有序关联容器】set 集合

文章目录 【 1. 基本原理 】【 2. set 的定义 】2.1 调用默认构造函数&#xff0c;创建空的 set 容器2.2 在创建 set 容器的同时&#xff0c;对其进行初始化2.3 拷贝构造的方式创建2.4 取已有 set 容器中的部分元素&#xff0c;来初始化新 set 容器2.5 修改排序规则的方式创建 …

web安全学习笔记(6)

记一下第十节课的内容。 一.PHP语言中的if else判断 语法和c语言中非常类似&#xff0c;不再赘述&#xff0c;也可以使用if...elseif...elseif...else 1.True和False 2.&#xff0c;和 一个等号是赋值 两个等号是比较 三个等号是全等&#xff08;内容相等&#xff0c;数…

职场中的情绪管理:如何应对工作中的愤怒情绪?

在职场中&#xff0c;我们常常会遇到一些让我们感到愤怒的事情。或许是同事的不配合&#xff0c;或许是上司的不理解&#xff0c;又或许是客户的无理取闹。然而&#xff0c;作为一个职业人&#xff0c;我们需要学会如何管理自己的情绪&#xff0c;尤其是愤怒情绪&#xff0c;以…

linux文件权限与数字转化

chmod命令——change mode&#xff0c;可以对特定文件文件夹权限进行更改 这里我们看到&#xff0c;当执行了chmod u-x try.sh后&#xff0c;try文件底色变为白色&#xff0c;即为其执行权限被“减去” 在linux系统中&#xff0c;权限的减去是通过权限的数字表示来实现的&#…

elment UI el-date-picker 月份组件选定后提交后台页面显示正常,提交后台字段变成时区格式

需求&#xff1a;要实现一个日期的月份选择<el-date-picker :typeformData.dateType :value-formatdateFormat v-modelformData.leaveFactoryDateplaceholder选择月份></el-date-picker>错误示例&#xff1a;将日期显示类型(type)dateType或将日期绑定值的格式(val…

016——DHT11驱动开发(基于I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 电路描述 1.3 通信协议 二、 驱动程序 三、 应用程序 四、 上机实验 一、 模块介绍 1.1 简介 DHT11 是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器&#xff0c;会测量空气中湿度&#xff0c;再根据测量结果决定是否继续加…