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
英文地址,請注明出處:http://en.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 …