每日c/c++題 備戰藍橋杯(二分答案模版)

在算法學習中,二分答案算法是一種非常高效且常用的技巧。它的核心思想是通過不斷縮小搜索范圍,逐步逼近目標答案。相比傳統的暴力搜索,二分答案算法的時間復雜度通常為 O(logn),特別適合處理大規模數據的查找問題。

本文將詳細介紹二分答案算法的兩種常見模板,并結合實際應用場景,幫助你更好地理解和使用這一算法。

二分答案算法的基本原理

二分答案算法的核心思想是:在一個有序的區間中,通過不斷將區間分成兩部分,判斷答案可能存在的那一部分,從而逐步縮小搜索范圍,最終找到目標答案

這種算法特別適合以下幾種場景:

  1. 尋找符合要求的區間的最大值或最小值:例如,找到一個數組中第一個滿足條件的元素。

  2. 尋找最大值的最小值:例如,在分配問題中找到最小的最大分配值。

  3. 尋找最小值的最大值:例如,在優化問題中找到最大的最小值。

這些場景通常難以通過傳統的暴力搜索高效解決,而二分答案算法可以輕松應對。

二分答案算法的適用場景

在實際編程中,二分答案算法的應用非常廣泛。以下是一些常見的適用場景:

  1. 尋找符合要求的區間的邊界

    • 例如,找到一個有序數組中第一個大于等于某個值的元素。

    • 或者找到最后一個小于等于某個值的元素。

  2. 優化問題中的極值查找

    • 例如,在分配問題中,找到最小的最大分配值。

    • 或者在調度問題中,找到最大的最小時間間隔。

  3. 尋找滿足條件的最優解

    • 例如,在矩陣中找到滿足條件的最小元素。

二分答案算法的兩種模板

模板一:查找左邊界和右邊界

查找左邊界 (Search Left, SL)
int SL(int l, int r) {while (l < r) {int mid = l + r >> 1; // 等價于 (l + r) / 2if (check(mid)) r = mid;else l = mid + 1;}return l;
}
查找右邊界 (Search Right, SR)
int SR(int l, int r) {while (l < r) {int mid = l + r + 1 >> 1; // 需要 +1 防止死循環if (check(mid)) l = mid;else r = mid - 1;}return r;
}

模板一的特點

  1. 查找左邊界

    • mid 的計算方式為 (l + r) / 2

    • 如果 check(mid) 為真,則說明目標可能在左半部分,將右邊界 r 更新為 mid

    • 否則,將左邊界 l 更新為 mid + 1

  2. 查找右邊界

    • mid 的計算方式為 (l + r + 1) / 2,這是為了避免死循環。

    • 如果 check(mid) 為真,則說明目標可能在右半部分,將左邊界 l 更新為 mid

    • 否則,將右邊界 r 更新為 mid - 1

模板二:另一種實現方式

查找左邊界 (Search Left, SL)
int SL(int l, int r) {while(l <= r) {int mid = (l + r) >> 1;if(check(mid)) {r = mid - 1; // 繼續在左半部分查找} else {l = mid + 1; // 繼續在右半部分查找}}return l;
}
查找右邊界 (Search Right, SR)
int SR(int l, int r) {while(l <= r) {int mid = (l + r) >> 1;if(check(mid)) {l = mid + 1; // 繼續在右半部分查找} else {r = mid - 1; // 繼續在左半部分查找}}return r;
}

模板二的特點

  1. 查找左邊界

    • 如果 check(mid) 為真,則說明目標可能在左半部分,將右邊界 r 更新為 mid - 1

    • 否則,將左邊界 l 更新為 mid + 1

    • 最終返回 l,即左邊界。

  2. 查找右邊界

    • 如果 check(mid) 為真,則說明目標可能在右半部分,將左邊界 l 更新為 mid + 1

    • 否則,將右邊界 r 更新為 mid - 1

    • 最終返回 r,即右邊界。

模板對比與適用場景

模板一的優點

  • 代碼更簡潔:邏輯清晰,適合快速實現。

  • 適用于精確查找邊界:特別適合需要找到第一個滿足條件的元素(左邊界)或最后一個滿足條件的元素(右邊界)。

模板二的優點

  • 更統一:求mid的時候,不用分+1的情況

  • 更直觀:容易理解,適合初學者。

  • 適用于范圍查找:適合需要找到滿足條件的元素范圍的邊界。

選擇模板的建議

  • 如果你需要快速實現并確保代碼簡潔,可以選擇模板一。

  • 如果你需要更直觀的邏輯處理和更統一的模板,可以選擇模板二。

模版的記憶方法

求左邊界則返回L,求右邊界則返回R

二分答案算法的實際應用

在實際編程中,二分答案算法的應用非常廣泛。以下是一些常見的應用場景和示例:

示例 1:尋找符合要求的區間的最小值

假設你需要在一個有序數組中找到第一個大于等于某個目標值的元素。可以使用模板一的查找左邊界方法。

bool check(int mid, int target, vector<int>& arr) {return arr[mid] >= target;
}int findFirstGreaterEqual(int target, vector<int>& arr) {int l = 0, r = arr.size() - 1;return SL(l, r);
}

示例 2:尋找最大值的最小值

例如,在分配問題中,你需要將一組物品分配給若干人,使得每個人分配到的物品總和的最大值最小。可以使用二分答案算法來尋找這個最小的最大值。

bool check(int mid, vector<int>& items, int k) {int cnt = 1, sum = 0;for (int item : items) {sum += item;if (sum > mid) {cnt++;sum = item;}}return cnt <= k;
}int findMinMaxAllocation(vector<int>& items, int k) {int l = *max_element(items.begin(), items.end());int r = accumulate(items.begin(), items.end(), 0);return SL(l, r);
}

示例 3:尋找最小值的最大值

例如,在調度問題中,你需要找到最大的最小時間間隔。可以使用二分答案算法來尋找這個最大的最小值。

bool check(int mid, vector<int>& times) {int cnt = 1, prev = times[0];for (int time : times) {if (time - prev >= mid) {cnt++;prev = time;}}return cnt >= required;
}int findMaxMinInterval(vector<int>& times, int required) {sort(times.begin(), times.end());int l = 0, r = times.back() - times[0];return SR(l, r);
}

總結

二分答案算法是一種非常強大的工具,特別適合解決以下幾類問題:

  1. 尋找符合要求的區間的最大值或最小值。

  2. 尋找最大值的最小值。

  3. 尋找最小值的最大值。

通過本文介紹的兩種模板,你可以根據具體問題選擇合適的實現方式。模板一適合快速實現精確查找,而模板二則更適合處理復雜的邊界條件。

希望本文能幫助你更好地理解和使用二分答案算法!如果你有任何問題或建議,歡迎在評論區留言。讓我們一起探索算法的無限可能!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75068.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75068.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75068.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NLP高頻面試題(二十六)——RAG的retriever模塊作用,原理和目前存在的挑戰

在自然語言處理領域&#xff0c;檢索增強生成&#xff08;Retrieval-Augmented Generation&#xff0c;簡稱RAG&#xff09;是一種將信息檢索與文本生成相結合的技術&#xff0c;旨在提升模型的回答準確性和信息豐富度。其中&#xff0c;Retriever在RAG架構中扮演著關鍵角色&am…

第30周Java分布式入門 分布式基礎

分布式基礎課程筆記 一、什么是分布式&#xff1f; 1. 權威定義 分布式系統定義為&#xff1a;“利用物理架構形成多個自治的處理元素&#xff0c;不共享主內存&#xff0c;通過發送消息合作”。 2. 核心解釋 物理架構與處理元素 &#x1f31f; 多臺獨立服務器/電腦&#x…

Vuex狀態管理

Vuex Vuex是一個專為Vue.js應用程序開發的狀態管理模式。它采用集中式管理應用的所有組件狀態&#xff0c;并以相應的規則保證狀態以一種可預測的方式發生變化。&#xff08;類似于在前端的數據庫&#xff0c;這里的數據存儲在內存當中&#xff09; 一、安裝并配置 在項目的…

從代碼學習深度學習 - 使用塊的網絡(VGG)PyTorch版

文章目錄 前言一、VGG網絡簡介1.1 VGG的核心特點1.2 VGG的典型結構1.3 優點與局限性1.4 本文的實現目標二、搭建VGG網絡2.1 數據準備2.2 定義VGG塊2.3 構建VGG網絡2.4 輔助工具2.4.1 計時器和累加器2.4.2 準確率計算2.4.3 可視化工具2.5 訓練模型2.6 運行實驗總結前言 深度學習…

Baklib激活企業知識管理新動能

Baklib核心技術架構解析 Baklib的底層架構以模塊化設計為核心&#xff0c;融合知識中臺的核心理念&#xff0c;通過分布式存儲引擎與智能語義分析系統構建三層技術體系。數據層采用多源異構數據接入協議&#xff0c;支持文檔、音視頻、代碼片段等非結構化數據的實時解析與分類…

小智機器人中的部分關鍵函數,FreeRTOS中`xEventGroupWaitBits`函數的詳細解析

以下是對FreeRTOS中xEventGroupWaitBits函數的詳細解析&#xff1a; 函數功能 xEventGroupWaitBits用于在事件組中等待指定的位被設置。它可以配置為等待任意一個位或所有位&#xff0c;并支持超時機制。 注意&#xff1a;該函數不能在中斷中調用。 函數原型 EventBits_t xEv…

關注分離(Separation of Concerns)在前端開發中的實踐演進:從 XMLHttpRequest 到 Fetch API

關注分離&#xff08;Separation of Concerns&#xff09;在前端開發中的實踐演進&#xff1a;從 XMLHttpRequest 到 Fetch API 一、關注分離的核心價值 關注分離&#xff08;SoC&#xff09;是軟件工程領域的重要設計原則&#xff0c;強調將系統分解為不同維度的功能模塊&am…

C之(16)scan-build與clang-tidy使用

C之(16)scan-build與clang-tidy使用 Author: Once Day Date: 2025年3月29日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: Linux實踐記錄_Once_da…

在 Vue 項目中快速集成 Vant 組件庫

目錄 引言一、找到 src 下的App.js 寫入代碼。二、安裝Vant三、解決 polyfill 問題四、查看依賴五、配置webpack六、引入 Vant七、在組件中使用 Vant八、在瀏覽器中查看樣式總結 引言 在開發移動端 Vue 項目時&#xff0c;選擇一個高效、輕量且功能豐富的組件庫是提升開發效率…

“GPU 擠不動了?”——聊聊基于 GPU 的計算資源管理

“GPU 擠不動了?”——聊聊基于 GPU 的計算資源管理 作者:Echo_Wish “老板:為什么 GPU 服務器卡得跟 PPT 一樣?” “運維:我們任務隊列爆炸了,得優化資源管理!” 在 AI 訓練、深度學習、科學計算的場景下,GPU 計算資源已經成為香餑餑。但 GPU 服務器貴得離譜,一臺 A…

AI滲透測試:網絡安全的“黑魔法”還是“白魔法”?

引言&#xff1a;AI滲透測試&#xff0c;安全圈的“新魔法師” 想象一下&#xff0c;你是個網絡安全新手&#xff0c;手里攥著一堆工具&#xff0c;正準備硬著頭皮上陣。這時&#xff0c;AI蹦出來&#xff0c;拍著胸脯說&#xff1a;“別慌&#xff0c;我3秒掃完漏洞&#xff0…

(二)GEE基礎學習初探及案例詳解【20250330】

Google Earth Engine(GEE)是由谷歌公司開發的眾多應用之一。借助谷歌公司超強的服務器運算能力以及與NASA的合作關系&#xff0c;GEE平臺將Landsat、MODIS、Sentinel等可以公開獲取的遙感圖像數據存儲在谷歌的磁盤陣列中&#xff0c;使得GEE用戶可以方便的提取、調用和分析海量…

redhat認證是永久的嗎

?認證有效期 ?紅帽認證一般有效期為3年?&#xff08;如RHCSA、RHCE、RHCA等&#xff09;&#xff0c;從通過考試之日起計算。 ?例外&#xff1a;部分基礎或工程師認證&#xff08;如Red Hat Certified Engineer&#xff09;有效期為三年時間&#xff0c;以官方最新政策為準…

git --- cherry pick

git --- cherry pick cherry pick cherry pick Cherry Pick 是 Git 中的一個操作&#xff0c;它允許你選擇某個分支的某次&#xff08;或多次&#xff09;提交&#xff0c;并將其應用到當前分支&#xff0c;而不會合并整個分支的所有更改。 cherry pick 的作用 只提取某個特定的…

妙用《甄嬛傳》中的選妃來記憶概率論中的乘法公式

強烈推薦最近在看的不錯的B站概率論課程 《概率統計》正課&#xff0c;零廢話&#xff0c;超精講&#xff01;【孔祥仁】 《概率統計》正課&#xff0c;零廢話&#xff0c;超精講&#xff01;【孔祥仁】_嗶哩嗶哩_bilibili 其中概率論中的乘法公式&#xff0c;老師用了《甄嬛傳…

AI 的出現是否能替代 IT 從業者?

AI 的出現是否能替代 IT 從業者&#xff1f; AI 的快速發展正在深刻改變各行各業&#xff0c;IT 行業也不例外。然而&#xff0c;AI 并非完全替代 IT 從業者&#xff0c;而是與其形成互補關系。本文將從 AI 的優勢、IT 從業者的不可替代性、未來趨勢等方面&#xff0c;探討 AI…

【leetcode100】有效的括號

1、題目描述 給定一個只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判斷字符串是否有效。 有效字符串需滿足&#xff1a; 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應的…

為什么使用Flask + uWSGI + Nginx 部署服務?

概述 在Python開發的web應用中&#xff0c;我們通常能夠看到flask、uWSGI、Nginx出現在一起&#xff0c;他們之間的關系是什么&#xff1f;為什么總是被應用在一起&#xff1f; &#xfeff; 三者共同使用為了實現一個目的&#xff1a;客戶端向服務端發送數據請求&#xff0c;服…

接口等冪處理

介紹 ? 什么是等冪&#xff08;Idempotency&#xff09;&#xff1f; 等冪 無論這個操作被執行多少次&#xff0c;結果都是一樣的&#xff0c;不會因為多次執行而產生副作用。 通俗一點說&#xff1a;“點一次和點一百次&#xff0c;效果是一樣的。” ? 在接口中&#xff0…

P1090合并果子(優先隊列)

洛谷題目 這里使用的是優先隊列&#xff0c;非常簡單 首先讓我們一起來學習一下優先隊列&#xff08;默認是從大到小來排列&#xff09; 首先要使用頭文件 #include<queue> using namespace std; 然后聲明有限隊列 priority_queue<int> a; priority_queue&…