算法:二分查找

article/2025/6/27 9:08:46

1.二分查找

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

 二分查找算法要确定“二段性”,时间复杂度为O(lonN)。为了防止数据溢出,所以求mid时要用防溢出的方式。

class Solution {
public:int search(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while(left <= right){//int mid = (left + right) / 2;int mid = left + (right - left) / 2;//防溢出if(target > nums[mid]){left = mid + 1;}else if(target < nums[mid]){right = mid - 1;}else{return mid;}}return -1;}
};

朴素二分模版

while(left <= right){int mid = left + (right - left) / 2;//防溢出if(......){left = mid + 1;}else if(......){right = mid - 1;}else{return ......;}}

2.在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

用二分查找解决,要查找一个区间要找去左端点和右端点。

1. 查找区间的左端点

细节处理:

        1. 循环条件 left < right 而不是left <= right ,因为left == right 的时候就是最终结果,无需判断。如果判断了就会死循环(当left和right构成的区间中存在结果,并且 nums[mid] >= t时,此时mid也等于left和right,进行上述操作的时候会导致right = mid一直在原地,所以导致死循环)。

        2. 求中点的操作

left + (right - left)/ 2 要向下取整,当剩两个点让mid的指针指向left。

2.查找区间右端点

与查找区间左端点的方法类似,只是处理条件不同。

1.当nums[mid] <= target 时left == mid。

2.当nums[mid] > target 时right == mid - 1。

循环条件:left < right 和上述原因一致。

求中点的方式 left + (right - left + 1) / 2 要向上取整,当剩两个点让mid的指针指向right。

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {if(nums.size() == 0)return {-1, -1};int left = 0, right = nums.size() - 1;int begin = 0;while(left < right)//确定区间的左端点{int mid = left + (right - left) / 2;//防溢出写法if(nums[mid] < target)left = mid + 1;elseright = mid;}//判断是否有结果if(nums[left] != target)return {-1,-1};elsebegin = left;left = 0, right = nums.size() - 1;while(left < right)//确定区间的右端点{int mid = left + (right - left + 1) / 2;if(nums[mid] <= target)left = mid;else right = mid - 1;}//如果存在左端点,那么右端点也一定存在,所以不用判断了,直接返回return {begin, right};}
};

总结二分模版

        while(left < right){int mid = left + (right - left) / 2;if(......)left = mid + 1;elseright = mid;}while(left < right)//确定区间的右端点{int mid = left + (right - left + 1) / 2;if(......)left = mid;else right = mid - 1;}

3. 搜索插入位置

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

 思路:二分查找,用左端点的模版,直接找到查找加返回要插入位置的值。如果未找到target,则检查target是否大于nums[right]:如果是,插入位置为right + 1;否则,插入位置为right(即第一个大于等于target的位置)。

class Solution {
public:int searchInsert(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while(left < right)  {int mid = left + (right - left) / 2;if(nums[mid] < target)left = mid + 1;elseright = mid;}if(target > nums[right])return right + 1;elsereturn right;}
};

4. x的平方根

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

直接将1 ~ x作为查找区间,找小于等于mid*mid的x的值

class Solution {
public:int mySqrt(int x) {if(x < 1) return 0;long long left = 0, right = x;while(left < right){long long mid = left + (right - left + 1) / 2;if(mid * mid <= x)left = mid;elseright = mid - 1;}return left;}
};

5. 山脉数组的峰顶索引

852. 山脉数组的峰顶索引 - 力扣(LeetCode)

 运用二分查找算法,因为在山脉数组中,在前一段山脉arr[mid] > arr[mid - 1],在后一段山脉arr[mid] < arr[mid - 1];根据这个二段性,使用二分查找。

class Solution {
public:int peakIndexInMountainArray(vector<int>& arr) {int left = 0, right = arr.size() - 1;while(left < right){int mid = left + (right - left + 1) / 2;if(arr[mid] > arr[mid - 1])left = mid;elseright = mid - 1;}return left;}
};

6. 寻找峰值

162. 寻找峰值 - 力扣(LeetCode)

运用二分查找算法:对于区间中nums[i] 和 nums[i + 1],如果nums[i] < nums[i + 1],那么这段区间程上升趋势,因为nums[-1]和nums[n] = -\infty,所以在后一段区间内一定有峰值,让left = mid + 1.

如果nums[i] > nums[i + 1],程下降趋势,在前一段区间内一定有峰值,让right = mid。

class Solution {
public:int findPeakElement(vector<int>& nums) {int left = 0, right = nums.size() - 1;while(left < right){int mid = left + (right - left) / 2;if(nums[mid] > nums[mid + 1])right = mid;elseleft = mid + 1;}return left;}
};

7.寻找旋转排序数组中的最小值

153. 寻找旋转排序数组中的最小值 - 力扣(LeetCode)

 思路:使用二分查找,因为这个数组是有二段性的(要找的值为第二段的第一个元素),将这个数组分为两段第一段的值一定比第二段的值大,所以根据nums[mid]和nums[n - 1]的关系作为比较。nums[mid]>nums[n - 1],说明在mid第一段,所以要让left = mid + 1;nums[mid] <= nums[n - 1]时,说明mid在第二段上,要让right = mid。

第二种方法是一nums[0]作为比较值,只是这种有特殊情况,全是升序的时候会导致mid一直向后走,所以找特殊判断一下升序的情况。

class Solution {
public:int findMin(vector<int>& nums) {/*int left = 0, right = nums.size() - 1, n = nums.size();while(left < right){int mid = left + (right - left) / 2;if(nums[mid] > nums[n - 1])left = mid + 1;elseright = mid;}return nums[right];*/int left = 0, right = nums.size() - 1, n = nums.size();if(nums[n - 1] > nums[0])return nums[0];while(left < right){int mid = left + (right - left) / 2;if(nums[mid] >= nums[0])left = mid + 1;elseright = mid;}return nums[right];}
};

8.点名

LCR 173. 点名 - 力扣(LeetCode)

 1.哈希表;2.直接遍历找结构;3.位运算;4.求和公式。这些方法的时间复杂度都是O(N)。

方法5:二分查找:这个数组有二段性,分成两段判断对应的值是否相等,还需要处理一下全升序的情况

class Solution {
public:int takeAttendance(vector<int>& records) {int left = 0, right = records.size() - 1, n = records.size();if(records[n - 1] == n - 1)    return n;while(left < right){int mid = left + (right - left) / 2;if(records[mid] == mid)left = mid + 1;elseright = mid;}return right;}
};


http://www.hkcw.cn/article/fDpVFbxXjb.shtml

相关文章

Elasticsearch 读写流程深度解析

在数据驱动的数字化浪潮中&#xff0c;Elasticsearch 凭借其毫秒级搜索响应与水平扩展能力&#xff0c;已成为现代数据架构的核心引擎。本文将深入剖析其读写流程的设计思想、实现细节与工程权衡&#xff0c;揭示这一分布式系统的精妙架构。 一、 架构基石&#xff1a;分布式设…

2024年第十五届蓝桥杯Scratch10月stema选拔赛真题——数字卡片排序

2024年第十五届蓝桥杯Scratch10月stema选拔赛真题——数字卡片排序 题目可点下面去处&#xff0c;支持在线编程~ 数字卡片排序_scratch_少儿编程题库学习中心-嗨信奥 程序演示可下下面去处&#xff0c;支持获取素材和源码~ 数字卡片排序-scratch作品-少儿编程题库学习中心-嗨…

基于遥感图像深度学习的海洋测深

知识星球&#xff1a;数据书局。打算通过知识星球将这些年积累的知识、经验分享出来&#xff0c;让各位在数据治理、数据分析的路上少走弯路&#xff0c;另外星球也方便动态更新最近的资料&#xff0c;提供各位一起讨论数据的小圈子 1. 摘要 沿海开发和规划面临的问题&#…

《使命召唤》防线失守:系列多款游戏被破解,黑客公开源代码 堡垒首次被突破

每当一款新游戏在PC平台发售,如果未使用Denuvo加密技术,破解者们就会竞相争夺首个破解该作品的机会。例如,《漫威蜘蛛侠 2》和《最后生还者 2》分别在发售后不到两分钟和一天内被破解。长期以来,《使命召唤》系列因其独特的数字版权管理技术和始终在线的网络连接而被视为难…

男子端午节爬野山迷路,还执意自己找路!27人冒雨搜山救援 公益救援彰显大爱

5月31日端午节,在北京房山的一处野山中,一名男子登山迷路却不想麻烦救援队,坚持要自己摸索下山。男子曾向警方询问下山道路,但拒绝了蓝天救援队的帮助。然而不久后,他再次联系救援队请求援助,称自己过于自信,但找不到路。尽管被困男子最初未请求救援,房山蓝天救援队出于…

中山漫展 女童暴露服装引争议

中山漫展 女童暴露服装引争议!6月1日,在广东中山漫展现场,观众看到两名女童身着暴露服装参加付费直播活动,纷纷提出质疑。微信公众号“中山博览中心”5月27日发文称,5月31日至6月1日10点-17点,将在中山博览中心前厅和综合展厅举行“2025中山AS24端午动漫嘉年华”活动。文…

前端八股之CSS

CSS 盒子模型深度解析与实战 一、盒子模型核心概念 Box-sizing CSS 中的 box-sizing 属性定义了引擎应该如何计算一个元素的总宽度和总高度 语法&#xff1a; box-sizing: content-box|border-box|inherit:content-box 默认值&#xff0c;元素的 width/height 不包含paddi…

渊龙靶场-sql注入(数字型注入)

1.开局请求抓包 测试点如上图&#xff0c;测试注入&#xff0c;存在注入。 2.查询列数 我们再查他多少列 ,最后测试为为2列。 3.查询回显位 发现均可以回显 4.查询表 插入语句查询表和数据库 union select database(),group_concat(table_name) FROM information_schema.t…

Linux内核体系结构简析

1.Linux内核 1.1 Linux内核的任务 从技术层面讲&#xff0c;内核是硬件和软件之间的一个中间层&#xff0c;作用是将应用层序的请求传递给硬件&#xff0c;并充当底层驱动程序&#xff0c;对系统中的各种设备和组件进行寻址。从应用程序的角度讲&#xff0c;应用程序与硬件没有…

ESP-IDF 离线安装——同时存在多个版本以及进行版本切换的方法

一、离线安装包的下载方法 ESP-IDF离线安装包下载链接 我下载了下面三个版本进行测试 二、离线安装包的安装方法 1.创建文件夹 创建ESP-IDF文件夹&#xff0c;并为不同版本的IDF分别创建一个文件夹&#xff0c;如下图所示 2.双击离线安装包&#xff08;以5.0版本为例&am…

企业数实产业技术融合数据(2000-2024)

1943 企业数实产业技术融合(2000-2024&#xff09; 数据简介 当前&#xff0c;高质量发展成为经济发展主赛道&#xff0c;新质生产力不仅是经济转型的关键力量 ,更是引领新兴战略性产业、提高国家竞争力的核心要素。在全球经济动荡格局中&#xff0c;发展新质生产力对推动高…

CANoe Trace中DLC和Data length的区别

✅ 1. DLC 与 Data Length 的区别 字段名含义备注DLC (Data Length Code)指示该 CAN 帧声明的数据长度&#xff08;0~8&#xff09;这是 报文头中的信息Data LengthCANoe 实际提取并显示的 Data 字节数量一般是 等于 DLC&#xff0c;但有例外&#xff08;如下&#xff09; ✅ …

简单了解string类的特性及使用(C++)

string的特性 string类不属于STL&#xff0c;它属于标准库 但由于它具有数据结构的特性&#xff0c;所以从归类的角度&#xff0c;可以将string类归类到容器里面去 在C标准库中&#xff0c;std::string 是一个特化的类型&#xff0c;实际上是 std::basic_string 的别名。std…

【stm32开发板】PCB模块化布局

一、DCDC电路布局规则 通顺 抗干扰 1.通顺 流过大电流的路径尽可能的短 2.抗干扰 可以在反馈线附近加过孔&#xff0c;增强抗干扰能力 二、PCB布局 1、将原理图转到PCB 2.点击应用修改 3.修改规则 将mm改成mil 将安全间距里的填充区域/泪滴的导线间距改为6&#xff0c;还…

【性能调优系列】深入解析火焰图:从基础阅读到性能优化实战

博客目录 一、火焰图基础&#xff1a;结构与阅读方法二、深入分析火焰图&#xff1a;关键观察点与性能瓶颈识别1. 识别最宽的函数块2. HTTP 请求处理分析3. 数据库操作分析4. 业务逻辑分析 三、性能优化实战&#xff1a;从火焰图到解决方案1. 线程池性能优化2. 数据库访问优化3…

AI智能体|扣子(Coze)搭建【合同/文档审查】工作流

你好&#xff0c;我是偶然&#xff01;前段时间工作上发生了重大的调整&#xff0c;导致我停更超一周。 但在这段时间里&#xff0c;我也有了一些自己的职场上的感悟&#xff0c;下面我分享给你&#xff0c;再给你分享今天的智能体。 不要怕任何的人和事&#xff0c;为什么怕&a…

家政维修平台实战12搭建服务详情功能

目录 1 创建页面2 搭建布局2.1 搭建背景容器2.2 添加内容区域2.3 配置服务项目图片2.4 搭建标题和价格2.5 搭建服务详情 最终效果总结 上一篇我们介绍了服务规格的搭建过程&#xff0c;有了后台功能并且维护好数据之后&#xff0c;我们就可以开发服务详情页面了&#xff0c;先看…

回测效率提升500%!khQuant打板策略回测性能深度剖析——基于miniQMT的回测系统深度优化【AI量化第29篇】

我是Mr.看海&#xff0c;我在尝试用信号处理的知识积累和思考方式做量化交易&#xff0c;应用深度学习和AI实现股票自动交易&#xff0c;目的是实现财务自由~ 目前我正在开发基于miniQMT的量化交易系统——看海量化交易系统&#xff08;KhQuant 是其核心框架&#xff09;。 一、…

2025年上半年各地都发布了哪些电竞政策?虎牙Hyper电竞嘉年华引领新趋势

近日,2025虎牙Hyper电竞嘉年华正式宣布将于6月21日至22日在成都欢乐谷主题公园举行。这场盛会融合了电竞、文旅与乡村振兴,由新华社国家重点实验室主办,新华优品作为支持平台。活动不仅将呈现精彩的电竞比赛,还将通过直播展示乡村美景、特色农产品以及村民的热情好客。作为…

黄金直线拉升 国际金价跳空高开

6月2日,受特朗普关税政策影响,国际金价跳空高开,截至发稿前已经超过3340美元。今年以来,国际金价累计上涨约25.5%。截至当天上午10:30,各大银行和品牌金条价格普遍上涨,周生生、中国黄金、水贝等品牌的金条价格都有所上升。其中,周生生的涨幅最大,较前一天上涨了6元/克…