ACWing算法笔记 | 二分

🔍 C++ 二分查找双模板详解:左闭右开 vs 左闭右闭(二分笔记)

二分查找(Binary Search)是一类高效的搜索算法,在 O(log n) 的时间复杂度下查找答案,适用于单调性问题

C++ STL 的 lower_bound / upper_bound 其实也是基于二分的。

今天我们通过两个常用的 手写二分模板,来梳理二分查找的思维方法和不同场景的使用技巧。


📌 二分查找模板总览

模板一:找第一个满足条件的值(左端)

int bsearch_1(int l, int r) {while (l < r) {int mid = l + r >> 1; // 向下取整(mid 偏左)if (check(mid)) r = mid; // 答案在左边(含 mid)else l = mid + 1;         // 答案在右边}return l; // or r(此时 l == r)
}

特点:

  • 区间:[l, r] 是左闭右闭

  • 循环条件:l < r

  • 常用于:找最小的满足条件的值(即最左边的可行解)


模板二:找最后一个满足条件的值(右端)

int bsearch_2(int l, int r) {while (l < r) {int mid = l + r + 1 >> 1; // 向上取整(mid 偏右)if (check(mid)) l = mid; // 答案在右边(含 mid)else r = mid - 1;        // 答案在左边}return l; // or r(此时 l == r)
}

特点:

  • 区间:[l, r] 是左闭右闭

  • 循环条件:l < r

  • 常用于:找最大的满足条件的值(即最右边的可行解)


🔍 为什么要用两个模板?

这是很多初学者疑惑的点:为什么还要分两种模板?能不能一个模板通吃?

答案是:不能,因为不同的问题目标不同。

场景模板mid 取法判断逻辑
✅ 最小可行解(左边界)模板一mid = (l + r) / 2check(mid) 为真则收缩右边
✅ 最大可行解(右边界)模板二mid = (l + r + 1)/2check(mid) 为真则收缩左边

🧪 示例题目:

💡 例题一:给定一个数组,找第一个 ≥ target 的下标

int check(int mid) {return q[mid] >= target;
}
int bsearch_1(int l, int r) { // 找左边界while (l < r) {int mid = (l + r) >> 1;if (check(mid)) r = mid;else l = mid + 1;}return l;
}

💡 例题二:给定一个数组,找最后一个 ≤ target 的下标

int check(int mid) {return q[mid] <= target;
}
int bsearch_2(int l, int r) { // 找右边界while (l < r) {int mid = (l + r + 1) >> 1;if (check(mid)) l = mid;else r = mid - 1;}return l;
}

⚠️ 常见易错点

错误问题说明
mid = (l + r)/2 直接使用可能溢出更推荐 mid = l + (r - l)/2l + r >> 1
check(mid) 写错逻辑要明确是“满足条件”还是“不满足”
区间定义错模板一/二都假设 [l, r] 为闭区间
二分的前提没保证只能用于单调性问题,或者题目满足“有界、有解”

✅ 总结

模板用于寻找mid取法答案缩向
模板一最小满足条件的值mid = (l + r) / 2r = mid
模板二最大满足条件的值mid = (l + r + 1)/2l = mid

👉 牢记:左边界二分向左收缩,右边界二分向右推进


🧩 附:两者模板的简写统一风格

#include<bits/stdc++.h>
using namespace std;const int N = 1e6 + 10;
int n, m;
int q[N];int bsearch_1(int l, int r)
{while (l < r){int mid = l + r >> 1;if (check(mid))r = mid;else l = mid + 1;}return l;
}
int bsearch_1(int l, int r)
{while (l < r){int mid = l + r + 1 >> 1;if (check(mid))l = mid;else r = mid - 1;}return l;
}

        如果你觉得这篇二分笔记对你有帮助,欢迎 👍 收藏,也可以在评论区写下你最常用的模板或踩过的坑,一起进步!

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

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

相关文章

centos 新加磁盘分区动态扩容

你不能直接将一个分区分配给/dev/mapper/centos-root&#xff0c;因为这是一个逻辑卷&#xff08;属于 LVM 系统&#xff09;。不过&#xff0c;你可以通过以下步骤将/dev/sda3添加到现有卷组或创建新的逻辑卷&#xff1a; 确认磁盘和分区信息 首先检查分区是否已格式化以及是否…

python学智能算法(二十六)|SVM-拉格朗日函数构造

【1】引言 前序学习进程中&#xff0c;已经了解了拉格朗日乘数法求极值的基本原理&#xff0c;也了解了寻找最佳超平面就是寻找最佳分隔距离。 这篇文章的学习目标是&#xff1a;使用拉格朗日乘数法获取最佳的分隔距离。 【2】构造拉格朗日函数 目标函数 首先是目标函数f&a…

智能制造——48页毕马威:汽车营销与研发数字化研究【附全文阅读】

涵盖了汽车行业数字化转型、汽车营销业务能力建设&#xff08;以会员管理为例&#xff09;以及汽车研发与创新能力建设等议题。毕马威认为&#xff0c;软件定义汽车已成为汽车行业中的核心议题&#xff0c;并围绕此议题提供了相关方案。在市场观点方面&#xff0c;毕马威与多家…

嵌入式学习-PyTorch(8)-day24

torch.optim 优化器torch.optim 是 PyTorch 中用于优化神经网络参数的模块&#xff0c;里面实现了一系列常用的优化算法&#xff0c;比如 SGD、Adam、RMSprop 等&#xff0c;主要负责根据梯度更新模型的参数。&#x1f3d7;️ 核心组成1. 常用优化器优化器作用典型参数torch.op…

PostgreSQL实战:高效SQL技巧

PostgreSQL PG 在不同领域可能有不同的含义,以下是几种常见的解释: PostgreSQL PostgreSQL(简称 PG)是一种开源的关系型数据库管理系统(RDBMS),支持 SQL 标准并提供了丰富的扩展功能。它广泛应用于企业级应用、Web 服务和数据分析等领域。 PostgreSQL 的详细介绍 Po…

3-大语言模型—理论基础:生成式预训练语言模型GPT(代码“活起来”)

目录 1、GPT的模型结构如图所示 2、介绍GPT自监督预训练、有监督下游任务微调及预训练语言模型 2.1、GPT 自监督预训练 2.1.1、 输入编码&#xff1a;词向量与位置向量的融合 2.1.1.1、 输入序列与词表映射 2.1.1.2、 词向量矩阵与查表操作 3. 位置向量矩阵 4. 词向量与…

【Redis 】看门狗:分布式锁的自动续期

在分布式系统的开发中&#xff0c;保证数据的一致性和避免并发冲突是至关重要的任务。Redis 作为一种广泛使用的内存数据库&#xff0c;提供了实现分布式锁的有效手段。然而&#xff0c;传统的 Redis 分布式锁在设置了过期时间后&#xff0c;如果任务执行时间超过了锁的有效期&…

MYSQL--快照读和当前读及并发 UPDATE 的锁阻塞

快照读和当前读在 MySQL 中&#xff0c;数据读取方式主要分为 快照读 和 当前读&#xff0c;二者的核心区别在于是否依赖 MVCC&#xff08;多版本并发控制&#xff09;的历史版本、是否加锁&#xff0c;以及读取的数据版本是否为最新。以下是详细说明&#xff1a;一、快照读&am…

css样式中的选择器和盒子模型

目录 一、行内样式二、内部样式三、外部样式四、结合选择器五、属性选择器六、包含选择器七、子选择器八、兄弟选择器九、选择器组合十、伪元素选择器十一、伪类选择器十二、盒子模型 相关文章 学习标签、属性、选择器和外部加样式积累CSS样式属性&#xff1a;padding、marg…

关于基于lvgl库做的注册登录功能的代码步骤:

以下是完整的文件拆分和代码存放说明&#xff0c;按功能模块化划分&#xff0c;方便工程管理&#xff1a;一、需要创建的文件清单 文件名 作用 类型 main.c 程序入口&#xff0c;初始化硬件和LVGL 源文件 ui.h 声明界面相关函数 头文件 ui.c 实现登录、注册、主页面的UI 源文…

RAII机制以及在ROS的NodeHandler中的实现

好的&#xff0c;这是一个非常核心且优秀的设计问题。我们来分两步详细解析&#xff1a;先彻底搞懂什么是 RAII&#xff0c;然后再看 ros::NodeHandle 是如何巧妙地运用这一机制的。1. 什么是 RAII 机制&#xff1f; RAII 是 “Resource Acquisition Is Initialization” 的缩写…

Linux LVS集群技术

LVS集群概述1、集群概念1.1、介绍集群是指多台服务器集中在一起&#xff0c;实现同一业务&#xff0c;可以视为一台计算机。多台服务器组成的一组计算机&#xff0c;作为一个整体存在&#xff0c;向用户提供一组网络资源&#xff0c;这些单个的服务器就是集群的节点。特点&…

spring-ai-alibaba如何上传文件并解析

问题引出 在我们日常使用大模型时&#xff0c;有一类典型的应用场景&#xff0c;就是将文件发送给大模型&#xff0c;然后由大模型进行解析&#xff0c;提炼总结等&#xff0c;这一类功能在官方app中较为常见&#xff0c;但是在很多模型的api中都不支持&#xff0c;那如何使用…

「双容器嵌套布局法」:打造清晰层级的网页架构设计

一、命名与核心概念 “双容器嵌套布局法”&#xff0c;核心是通过两层容器嵌套构建网页结构&#xff1a;外层容器负责控制布局的“宏观约束”&#xff08;如页面最大宽度、背景色等&#xff09;&#xff0c;内层容器聚焦“微观排版”&#xff08;内容居中、内边距调整、红色内容…

基于深度学习的自然语言处理:构建情感分析模型

前言 自然语言处理&#xff08;NLP&#xff09;是人工智能领域中一个非常活跃的研究方向&#xff0c;它致力于使计算机能够理解和生成人类语言。情感分析&#xff08;Sentiment Analysis&#xff09;是NLP中的一个重要应用&#xff0c;其目标是从文本中识别和提取情感倾向&…

JWT原理及利用手法

JWT 原理 JSON Web Token (JWT) 是一种开放的行业标准&#xff0c;用于在系统之间以 JSON 对象的形式安全地传输信息。这些信息经过数字签名&#xff0c;因此可以被验证和信任。其常用于身份验证、会话管理和访问控制机制中传递用户信息。 与传统的会话令牌相比&#xff0c;JWT…

DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_睡眠记录日历示例(CalendarView01_30)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录DeepS…

git的diff命令、Config和.gitignore文件

diff命令&#xff1a;比较git diff xxx&#xff1a;工作目录 vs 暂存区&#xff08;比较现在修改之后的工作区和暂存区的内容&#xff09;git diff --cached xxx&#xff1a;暂存区 vs Git仓库&#xff08;现在暂存区内容和最一开始提交的文件内容的比较&#xff09;git diff H…

Linux中的LVS集群技术

一、实验环境&#xff08;RHEL 9&#xff09;1、NAT模式的实验环境主机名IP地址网关网络适配器功能角色client172.25.254.111/24&#xff08;NAT模式的接口&#xff09;172.25.254.2NAT模式客户机lvs172.25.254.100/24&#xff08;NAT模式的接口&#xff09;192.168.0.100/24&a…

【数据结构】「队列」(顺序队列、链式队列、双端队列)

- 第 112篇 - Date: 2025 - 07 - 20 Author: 郑龙浩&#xff08;仟墨&#xff09; 文章目录队列&#xff08;Queue&#xff09;1 基本介绍1.1 定义1.2 栈 与 队列的区别1.3 重要术语2 基本操作3 顺序队列(循环版本)两种版本两种版本区别版本1.1 - rear指向队尾后边 且 无 size …