基础算法--二分查找

devtools/2025/2/13 12:07:00/

什么是二分查找

二分查找,也叫折半查找,是一种专门为有序数组量身定制的查找算法。想象一下,你走进了一家按编号顺序排列书籍的图书馆,要找某一本书,要是从第一本开始逐本翻找,那可得费不少时间。二分查找可就机灵多了,它先把书架一分为二,看看目标书籍在左边还是右边,然后果断舍弃不需要的那半边,接着在剩下的半边里继续对半分、再找,如此循环,快速锁定目标。

二分查找的魅力所在

二分查找最大的优势就是效率高,它的时间复杂度是O(logN) 。啥意思呢?就是随着数据量 n 不断增大,查找所需的时间增长得极为缓慢。与之相比,顺序查找的时间复杂度是O(N) ,数据量一大,顺序查找耗时就会蹭蹭往上涨。打个比方,在有 100 万本书的图书馆里找书,二分查找可能几十次对比就搞定,顺序查找说不定就得翻个几十万次。

一道简单的题目示例

1.二分查找

 

 代码:

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

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

 这里也是用二分查找,只不过这里需要查找两个端点。

首先当我们查找左端点的时候,需要处理好细节,尤其是这里求中点的操作。必须是left+(right-left)/2,因为其实left = right的时候已经是最终结果了,走到最后情况就是两个数里面找中点,因为我们是找左端点mid会落到right的位置,如果这个时候mid也落在x>=t,那么right= mid,我们会发现right没有动,那么接下来就会进入死循环。但是当我们走left+(right-left)/2的时候,mid = left,无论是x<t还是x>=t都不会进入死循环,当x<t时,left = mid+1,这时就撞上了right停止循环,当x>=t时,right就更新为mid,这时会撞上left,也会停止循环。

那么右端点也同理,必须使用mid = left+(left-right+1)/2 ,当区间内还剩两个数时,mid当时必然会落在左边的数上,如果用第一个算,那么此时mid = left,如果这时x<=t的,则left又是等于mid,则left不变,这样就会进入死循环。

这里如果我们使用mid = left+(left-right+1)/2就不会进入死循环,因为这个时候mid会等于right,那么这个时候无论是走x<=t还是x>t都不会死循环,当x<=t的时候,更新left,left = mid,撞上right,循环截止,当x>t的时候,更新right,right = mid-1,right会撞上left,循环截止。

代码:

class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {if(nums.size()==0) return {-1,-1};int begin = 0,end = 0;int left = 0,right = nums.size()-1;// 二分左端点while(left<right){int mid = left+(right-left)/2;if(nums[mid]<target) left=mid+1;else right = mid;}if(nums[left]!=target) return {-1,-1};else begin = left;//二分右端点right = nums.size()-1;while(left<right){int mid = left+(right-left+1)/2;if(nums[mid]>target) right = mid-1;else left = mid;}return {begin,right};}   
};

总结二分模板:

3.x的平⽅根(easy) 

题目非常的简单,但我们这里主要是学习使用二分查找,暴力解法也很容易想到,就是将0-x的所有数字平方遍历一遍。但我们这里要使用的是二分查找。

首先找一下二段性 ,直接看下图,ret就是要返回的目标值,ret的左边的平方一定是小于等于x的,4包含4左边的平方一定是小于17的,6的左边包含它自己会小于等于36。

那么这里就可以直接套用我们上一题总结的模板了:
 

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


http://www.ppmy.cn/devtools/158472.html

相关文章

压控恒流源设计±2A大电流

压控恒流模块2A高精度激光压控恒流源 高精度压控恒流源 LED恒流模块 参数详见图1图2 电源输入:5V→15V&#xff08;双电源供电&#xff09; 恒流设置:压控4V对应2A 电流监控:4V对应电流2A 模块调制带宽:100kHz 采样电阻2R 注意: 单电源不可工作&#xff0c;需正负双路电源供电…

ollama本地部署 deepseek离线模型安装 一套从安装到UI运行

一、安装本地ollama 1、下载ollama (1)百度网盘windows版本 通过网盘分享的文件&#xff1a;OllamaSetup.exe 链接: https://pan.baidu.com/s/15ca6WAzrc4wWph5H9BEOzw 提取码: 283u (2)进入官网&#xff1a;Ollama 2、选择你的系统 等待下载完成就可以了。 注&#xff1a;这…

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中&#xff0c;可以通过Tomcat安装目录中“\bin\service.bat”来完成&#xff0c;如果目录中没有service.bat&#xff0c;则需要使用其它方法。 打到CMD命令行窗口&#xff0c;通过cd命令跳转到Tomcat安装目录的“\bin\”目录&#xff0c;然后执…

Games 202 Lecture 14 | SVGF RAE | TAA DLSS2.0 | Lumen

recap Spatiotemporal Variance-Guided Filtering 切面深度差异macro normal差异考虑variance的luminance差异 1.切平面深度差异 SVGF 过滤过程中切平面上深度差异引导的权重 公式等价于&#xff1a; 当分子&#xff08;深度差&#xff09;较小 时&#xff0c;指数项接近 e⁰…

DeepSeek应用——与word的配套使用

目录 一、效果展示 二、配置方法 三、使用方法 四、注意事项 1、永久化使用 2、宏被禁用 3、office的生成失败 记录自己学习应用DeepSeek的过程...... 这个是与WPS配套使用的过程&#xff0c;office的与这个类似&#xff1a; 一、效果展示 二、配置方法 1、在最上方的…

深度探索DeepSeek:成本效益之辩与市场展望

摘要 DeepMind的CEO对DeepSeek的成本效益提出质疑&#xff0c;认为其成本被过度炒作。他指出&#xff0c;DeepSeek所使用的技术大多源自谷歌和DeepMind。然而&#xff0c;分析机构SemiAnalysis强调&#xff0c;DeepSeek的优势在于其成本与能力的卓越组合。尽管目前DeepSeek的成…

Docker与容器交互——attach和exec

阅读《Docker 从入门到实践》时&#xff0c;读到“进入容器”这一章节&#xff0c;有两个主要 的命令&#xff0c;分别是&#xff1a; docker attach docker exec 其中提到一句话&#xff1a; 注意&#xff1a; 如果从这个 stdin 中 exit&#xff0c;会导致容器的停止。 …

Java面试--Spring AOP

面试题&#xff1a;Spring AOP介绍一下&#xff1a;(大疆、百度面试题) Spring基础部分博客如下&#xff1a; Spring基础系列&#xff08;一&#xff09; Spring基础系列&#xff08;二&#xff09; Spring基础系列&#xff08;三&#xff09; 什么是Spring AOP&#xff1a; Sp…