【专题刷题】二分查找(一):深度解刨二分思想和二分模板
📝前言说明:
- 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分
- 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
- 文章中的理解仅为个人理解。如有错误,感谢纠错
🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽
视频
- 二分查找算法介绍
- 704. 二分查找
- 朴素二分查找模板
- 34. 在排序数组中查找元素的第一个和最后一个位置
- 二分模板
二分查找算法介绍
因为我之前用python写题的时候也写过二分查找,也有点心得:
https://blog.csdn.net/tan_run/article/details/145514702
如今再学,任深感不足。通过 704 和 34 题再度感受和理解二分查找。
704. 二分查找

暴力解法:
遍历数组,依次和target比较,时间复杂度:O(n)
暴力解法的局限在于:每次只能判断一个数,没有利用数组升序的特点
更好的解法:二分查找。利用数组有序的特点,那怎么利用呢?
假设我们随机取一个下标i,将nums[i]与target比较,如果nums[i] < target,又因为数组有序,所以:nums[i]左边的数都小于target,我们就可以直接排除左边的区间。
而上面所体现的也叫做二段性:每次“选点”,通过该点可以让我们把探索区域划分成两份,并且能够排除一段区域。(只是选中点的时候,数学期望最小(易证),所以我们通常取中点,也叫做二分)
朴素二分查找模板
闭区间写法:

.......:根据二段性的特点来填写while(left <= right):因为是闭区间写法,区间不为空,还要判断left + (right - left) / 2:防溢出写法
34. 在排序数组中查找元素的第一个和最后一个位置

暴力解法:
从头到尾遍历数组,时间复杂度:O(n)
二分查找(利用二段性):
- 先找左端点:左端点左边的元素 <
t;左端点及左端点右边的元素 >=t。于是,我们就可以发现二段性:当nums[mid] < t,左端点一定严格在mid的右边[mid + 1, right](画图很好理解) ,left更新为mid + 1;当nums[mid] >= t的时候,左端点一定在[left, mid],mid位置不能排除,因为有可能mid就是左端点,right更新为mid - 上面这种方法其实是左闭右开区间的写法,
right所在位置已经判断过了,循环条件为while(left < right),因为当left == right的时候已经是空区间,循环不变量:right始终指向>= t的数字 - 求中点操作:在左闭右开这种写法里面,当有两个中间值时(数组长度为偶数),必须要选择前一个:
left + (right - left) / 2
重点:以上总结找左端点>=(左闭右开区间写法):
- 如果
nums[mid] < t,则右端点肯定在:[mid + 1, right] - 如果
nums[mid] >= t,则右端点肯定在:[left, mid] - 循环条件,
while(left < right)(因为是左闭右开的) - 求中点操作:
left + (right - left) / 2取前面的中点 - 循环不变量:
right始终指向第一个>= t的数
PS:多举例子,找极端例子看特殊情况
当然我们也可以直接写找右端点<=的:
- 如果
nums[mid] <= t,则右端点肯定在:[mid, right] - 如果
nums[mid] > t,则右端点肯定在:[left, mid - 1] - 循环条件,
while(left < right)(因为是左开右闭) - 求中点操作:
left + (right - left + 1) / 2取后面的中点
其他方法:在>=的基础上转换:

题解代码:
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;while(left < right){int mid = left + (right - left) / 2; // 防止溢出if(nums[mid] < target)left = mid + 1;elseright = mid;}if(nums[right] != target)return {-1, -1}; // 代表没有targetint begin = right;// 找右端点(左端点不重置)left = begin, right = nums.size() - 1;while(left < right){int mid = left + (right - left + 1) / 2;if(nums[mid] <= target)left = mid;elseright = mid - 1;}return {begin, right};}
};
二分模板

口诀:
mid:下面出现-1,上面就要+1if...else...:根据二段性写出
为什么呢?
首先,左右两种模板的取mid区别是:左边是向下取整,右边是向上取整
以右边模板为例:
右边模板的收缩范围:[mid, right] 或 [left, mid - 1]
如果此时剩余区间为:[right - 1, right],向下取整则mid = right - 1。如果,最后的判断进入if,则left = mid = right - 1和原来无异,就会死循环。
如果是向上取整:mid = right,进入if:left = right,进入else:right = right - 1,两条语句都变化了,就不会死循环
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!
相关文章:
【专题刷题】二分查找(一):深度解刨二分思想和二分模板
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
硬核解析!电动汽车能耗预测与续驶里程的关键技术研究
引言 随着电动汽车的普及,续航里程和能耗表现成为用户关注的核心痛点。然而,表显续航与实际续航的差异、低温环境下的电量衰减等问题始终困扰着消费者。本文基于《电动汽车能耗预测与续驶里程研究》的实验成果,深入剖析电动汽车能耗预测的核心模型、多环境测试方法及续航里…...
【OceanBase相关】01-OceanBase数据库部署实践
文章目录 一、前言1、介绍说明2、部署方案二、部署说明1、环境准备2、软件安装2.1、安装OAT2.2、安装OCP3、软件部署三、集群管理1、MySQL租户管理四、Q&A1、OBServer 服务器重启后 observer 进程未能自动启动1.1、问题说明1.2、解决措施2、ERROR 1235 (0A000) at line 1: …...
【华为OD机试真题】428、连续字母长度 | 机试真题+思路参考+代码解析(E卷)(C++)
文章目录 一、题目题目描述输入输出样例1样例2 一、代码与思路🧠C语言思路✅C代码 一、题目 参考:https://sars2025.blog.csdn.net/article/details/139492358 题目描述 ◎ 给定一个字符串,只包含大写字母,求在包含同一字母的子串…...
C# 综合示例 库存管理系统4 classMod类
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 在《库存管理系统》中使用classMod类来保存全局变量。 变量定义和含义,请详见下面的源代码: public class classMod { //数据库路径...
ZooKeeper配置优化秘籍:核心参数说明与性能优化
#作者:张桐瑞 文章目录 tickTime:Client-Server通信心跳时间initLimit:Leader-Follower初始通信时限syncLimit:Leader-Follower同步通信时限dataDir:数据文件目录clientPort:客户端连接端口服务器名称与地…...
详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别
详细讲解 QMutex 线程锁和 QMutexLocker 自动锁的区别 下面我们详细拆解 Qt 中用于线程同步的两个核心类:QMutex 和 QMutexLocker。 🧱 一、什么是 QMutex? QMutex 是 Qt 中的互斥锁(mutex)类,用于防止多个…...
PCB 过孔铜厚的深入指南
***前言:在上一期的文章中介绍了PCB制造的工艺流程,但仍然想在过孔的铜厚和PCB的过孔厚径比两个方面再深入介绍。 PCB铜厚的定义 电路中铜的厚度以盎司(oz)**表示。那么,为什么用重量单位来表示厚度呢? 盎司(oz)的定义 将1盎司(28.35 克)的铜…...
【ES实战】Elasticsearch中模糊匹配类的查询
Elasticsearch中模糊匹配类的查询 文章目录 Elasticsearch中模糊匹配类的查询通配符查询前缀匹配查询正则匹配查询标准的正则操作特殊运算符操作 模糊化查询Fuzziness text类型同时配置keyword类型 Elasticsearch中模糊类查询主要有以下 Wildcard Query:通配符查询P…...
Spring Security认证流程
认证是Spring Security的核心功能之一,Spring Security所提供的认证可以更好地保护系统的隐私数据与资源,只有当用户的身份合法后方可访问该系统的资源。Spring Security提供了默认的认证相关配置,开发者也可以根据自己实际的环境进行自定义身…...
TXPOLARITY/RXPOLARITY设置
TXPOLARITY/RXPOLARITY:该端口用来反向输出数据的极性。 0:表示不反向。TXP是正,TXN是负; 1:标识反向。TXP是负,TXN是正; 如下图所示:...
2026届华为海思秋暑期IC实习秋招笔试真题(2025.04.23更新)
今天给大家分享下华为海思2025.04.23号最新IC笔试真题。 华为海思IC前端中后端(COT&XPU)岗位笔试机考题 更多华为海思数字IC岗秋招实习笔试真题,可以私信小编。 数字后端培训实战项目六大典型后端实现案例 秒杀数字后端实现中clock gating使能端setup viola…...
优考试V4.20机构版【可注册】
优考试V4.20机构版,可通过注册机完美激活。 优考试机构版是一个功能强大的在线考试系统,适用于各种 考试场景,包括在线考试、培训、学习等多种用途。以下是优考试机构版的主要功能和特点: 多层级管理:优考试机…...
携国家图书馆文创打造AI创意短片,阿里妈妈AIGC能力面向商家开放
在4月23日“世界读书日”之际,阿里妈妈联合国家图书馆文创正式发布了三条AI创意视频。 该系列视频以“千年文脉典籍奇谈”为主题,借助阿里妈妈的AIGC能力,以AI链接古今,打开阅读典籍新方式,引起不少人强烈兴趣。据悉&…...
Spark,配置hadoop集群2
1.建立新文件,编写脚本程序 在hadoop101中操作,在/root/bin下新建文件:myhadoop,输入如下内容: 2.分发执行权限 保存后退出,然后赋予脚本执行权限 [roothadoop101 ~]$ chmod x /root/bin/myhadoop 像下图…...
4.1 融合架构设计:LLM与Agent的协同工作模型
大型语言模型(Large Language Models, LLMs)与智能代理(Agent)的融合架构已成为人工智能领域推动企业智能化的核心技术。这种协同工作模型利用LLM的语言理解、推理和生成能力,为Agent提供强大的知识支持,而…...
MMsegmentation第一弹-(认识与安装)
前言 在刚接触MMsegmentation的时候,我是怎么看都看不明白,那个过程实在是太痛苦了,所以我当时就想着一定要把这个写成文章,希望后来者能很轻松的就上手。该系列文章不涉及框架的底层原理,仅以一个使用者的身份带领读…...
12.无线网络安全入门
无线网络安全入门 第一部分:无线网络基础与风险第二部分:Wi-Fi攻击方式第三部分:无线网络安全实践总结 目标: • 理解无线网络的基本原理和安全风险 • 掌握Wi-Fi常见的攻击方式 • 通过实践提升对无线网络安全的认识和防护能力 …...
React19源码阅读之commitRoot
commitRoot入口 在finishConcurrentRender函数,commitRootWhenReady函数,commitRoot函数。 commitRoot流程图 commitRoot函数 commitRoot 函数是 React 渲染流程中用于提交根节点的关键函数。它的主要作用是设置相关的优先级和状态,然后调…...
目标检测:视觉系统中的CNN-Transformer融合网络
一、背景 无人机(UAVs)在城市自动巡逻中发挥着重要作用,但它们在图像识别方面面临挑战,尤其是小目标检测和目标遮挡问题。此外,无人机的高速飞行要求检测系统具备实时处理能力。 为解决这些问题,我们提出…...
Turso:一个基于 libSQL的分布式数据库
Turso 是一个完全托管的数据库平台,支持在一个组织中创建高达数十万个数据库,并且可以复制到任何地点,包括你自己的服务器,以实现微秒级的访问延迟。你可以通过Turso CLI(命令行界面)管理群组、数据库和API…...
深度学习前沿 | TransNeXt:仿生聚合注意力引领视觉感知新时代
目录 1. 引言 2. 背景与挑战 3. TransNeXt 核心创新 3.1 像素聚合注意力(PAA) 3.2 长度缩放余弦注意力(LSCA) 3.3 卷积 GLU(ConvGLU) 4. 模型架构详解 5. 实验与性能评估 5.1 图像分类(I…...
C语言-函数-1
以下是我初学C语言的笔记记录,欢迎在评论区留言补充 一,函数分为几类 * 函数分为两类: 一类是库函数;一类是自定义函数 * 库函数: 系统自己带的,在使用时候,要用到头文件; 查询库函…...
卡尔曼滤波解释及示例
卡尔曼滤波的本质是用数学方法平衡预测与观测的可信度 ,通过不断迭代逼近真实状态。其高效性和鲁棒性,通常在导航定位中,需要融合GPS、加速度计、陀螺仪、激光雷达或摄像头数据,来提高位置精度。简单讲,卡尔曼滤波就是…...
openwrt作旁路由时的几个常见问题 openwrt作为旁路由配置zerotier 图文讲解
1 先看openwrt时间,一定要保证时间和浏览器和服务器是一致的,不然无法更新 2 openwrt设置旁路由前先测试下,路由器能否ping通主路由,是否能够连接外网,好多旁路由设置完了,发现还不能远程好多就是旁路由本…...
Redis--预备知识以及String类型
目录 一、预备知识 1.1 基本全局命令 1.1.1 KEYS 1.1.2 EXISTS 1.1.3 DEL 1.1.4 EXPIRE 1.1.5 TTL 1.1.6 TYPE 1.2 数据结构以及内部编码 1.3 单线程架构 二、String字符串 2.1 常见命令 2.1.1 SET 2.1.2 GET 2.1.3 MGET 2.1.4 MSET 2.1.5 SETNX 2.2 计数命令 2.2.1 INCR 2.2.2…...
Redis 及其在系统设计中的作用
什么是Redis Redis 是一个开源的内存数据结构存储系统,可用作数据库、缓存和消息代理。它因其快速的性能、灵活性和易用性而得到广泛应用。 Redis 数据存储类型 Redis 允许开发人员以各种数据结构(例如字符串、位图、位域、哈希、列表、集合、有序集合…...
UEC++第10天|UEC++获取对象、RTTI是C++
最近在写UEC项目,这里写几个案例里的问题,还在学习阶段 1. 如何获取小鸟对象? void AFlappyBirdGameModeBase::BeginGame() { // 让管道动起来PipeActor->SetMoveSpeed();// 让小鸟开始飞行// 如何获取到小鸟对象APawn* Pawn UGameplayS…...
【python】一文掌握 markitdown 库的操作(用于将文件和办公文档转换为Markdown的Python工具)
更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 一、markitdown概述1.1 markitdown介绍1.2 MarkItDown支持的文件1.3 为什么是Markdown?二、markitdown安装2.1 pip方式安装2.2 源码安装2.3 docker方式安装三、基本使用3.1 命令行方式3.2 可选依赖项配置3.3 插件方…...
爬虫-oiwiki
我们将BASE_URL 设置为 "https://oi-wiki.org/" 后脚本就会自动开始抓取该url及其子页面的所有内容,并将统一子页面的放在一个文件夹中 import requests from bs4 import BeautifulSoup from urllib.parse import urljoin, urlparse import os import pd…...
