藍橋杯 臨時抱佛腳 之 二分答案法與相關題目

二分答案法(利用二分法查找區間的左右端點)

(1)估計 最終答案可能得范圍 是什么

(2)分析 問題的答案 給定條件 之間的單調性,大部分時候只需要用到 自然智慧

(3)建立一個f函數, 當答案固定的情況下 ,判斷 給定的條件是否達標

(4)在 最終答案可能的范圍上不斷二分搜索, 每次用f函數判斷,直到二分結束,找到最合適的答案

(5)當題目要查找一個區間的左右端點時(符合的區間有多個值找最大或者最小),可以考慮一下這個方法能不能用

綜上:

? ? ? ? 核心點:分析單調性,建立f函數

光說不練,假把式!開練!!!!!

下面有一些相關題目

題目一:愛吃香蕉的珂珂

測試鏈接:875. 愛吃香蕉的珂珂 - 力扣(LeetCode)

題解:

1.????????先看問題答案與對應條件的單調性,這道題中當吃香蕉的速度越大時,吃完所需要的時間就會越少,但這道題中要注意如果一小時內吃完一堆香蕉就會休息,等到下一個小時才會再次開始吃,如果一小時內沒有吃完,那么下一個小時就會繼續吃,吃完之后還是不會繼續吃其他堆的香蕉,還是會休息。所以這個題會用到向上取整算法( 例如a/b向上取整,(a+b-1)/b

2.?????????分析要二分什么,問題要求返回h小時內吃掉所有香蕉的最小速度k(k為整數),那這道題就是二分速度,并且速度與時間也符合單調性,速度也快,時間越短。考慮二分速度的左右區間,左區間 速度最小為1 最大速度為數組中最大數據的大小,因為如果速度大于最大數據時,吃完之后也不會繼續吃下一堆還是會休息,又有單調性所以最大數據的速度一定可以,但不會是答案。

3.? ? ? ? check函數,參數傳速度,返回吃完所需要的時間,然后與給定的k作對比,不斷的縮小范圍直到二分結束,返回答案。

class Solution {
public:int minEatingSpeed(vector<int>& piles, int h) {//定區間int r = 0;//找到數組中最大的數據作為區間的右端點for(int i=0; i<piles.size();i++){r = max(piles[i],r);}int ans = 0;//速度最小為1,左端點設置為1int l = 1;int mid =0;while(l<= r){// 等價于mid = (l+r)/2  但有時會越界防止越界mid = l+((r-l)>>1); // 二分點靠左if(check(piles,mid) <= h){//達標//記錄答案ans = mid;r = mid-1;}else{//不達標//不記錄答案直接去右面二分l = mid+1;}}return ans;}//check函數檢查是否符合要求long long check(vector<int>& piles, int mid){//時間是向上取整 ,初始化long long類型數據,防止數據過大越界long long ans = 0;    // ans為時間int i = 0;int size = piles.size();while(size--){// 時間是向上取整的ans += (piles[i++]-1)/mid + 1;}//返回mid速度,吃完所需時間return ans;}
};

題目二:分割數組的最大值

題目鏈接:410. 分割數組的最大值 - 力扣(LeetCode)?(畫匠問題)

題解:

1.? ? ? ? 總結題意就是將數組分成規定的份數,然后返回分好的這些組中各自和的最大值的最小(就是組內的和最大的組的和使這個數即可能的小返回最小)

2? ? ? ? 先看看這道題中最終答案,與給定條件之間是否存在單調性,最答案是各自總和的最大值,給定條件為劃分成幾份,當劃分的分數越多,各自的總和就會越小,存在一定的單調性。

3.? ? ? ? 思路就是寫一個函數,傳遞的參數就是各自總和的最大值,然后返回滿足在這個限制下,會將數組分成幾份,然后與給定的k作對比,不斷地縮小區間,直至二分結束

方法一:

????????在后面check函數中處理特殊情況(容易忘記處理)

class Solution {
public:int splitArray(vector<int>& nums, int k) {//二分答案 將最大部分的累加和一直二分,寫一個函數(每組數據都限制在這個累加和的范圍內時是否符合要求小于等于k個)判斷//非負整數可以為0//在前面可以將區間縮小到最小然后可以避免后面細節的判斷防止出錯//改法將左端點設置為最小0int l = 0;//二分區間的右端點,就是累計和的最大也就是將數組分成一份就是數組中所有元素的累加和 int r = 0;for(int i = 0; i<nums.size();i++){r += nums[i];}//起始將mid設為0 int mid = 0;//ans來記錄二分的答案,當答案滿足記錄下來繼續二分 int ans = 0;//確定了二分的大致范圍while(l<=r){//mid = (r+l)/2 下面這樣寫可以防止越界超過int的最大數值 mid = l+((r-l)>>1);//下面可以這樣理解,返回值小于<=k,就是符合限制條件并且分的分數還比規定的小,那么一定有mid if( check(nums,mid) <= k){//mid都符合要求,右面的limit一定符合要求,所以去左面進行二分查找//先記錄答案,然后去做左面看有沒有最優解ans = mid;r = mid-1;}else{//不符合要求,去右面找 l = mid +1;}}return ans;}//可以說用到了貪心算法,就是沒個部分都是最優解,這樣分的份數最小 int check(vector<int>& nums, int limit){int sum = 0;int ret= 1; //代表最少分幾份for(int i = 0 ;i<nums.size();i++){//如果數組中有值超過了限制,這個限制不成立if(nums[i] > limit) return INT_MAX;if(sum + nums[i] <= limit){//沒有滿 將數據吸納進來sum += nums[i];}else{//當前sum結束了,現在sum的值為當前num[i]的值ret++;sum = nums[i];}}return ret;}
};

方法二:

? ? ? ? 在前面劃分左右區間時就將區間范圍劃分到最小,這樣可以避免處理后面,數組中有大于限制情況。

class Solution {
public:int splitArray(vector<int>& nums, int k) {//二分答案 將最大部分的累加和一直二分,寫一個函數(每組數據都限制在這個累加和的范圍內時是否符合要求小于等于k個)判斷//非負整數可以為0//在前面可以將區間縮小到最小然后可以避免后面細節的判斷防止出錯int l = 0;int r = 0;for(int i = 0; i<nums.size();i++){r += nums[i];//區間的左值因為是數組劃分完后的最大的最小值,所以一定大于等于數組中最大元素的值,將左端點設置為數組中最大的元素l = max(l,nums[i]);}int mid = 0;int ans = 0;//確定了二分的大致范圍while(l<=r){mid = l+((r-l)>>1);if( check(nums,mid) <= k){//mid都符合要求,右面的limit一定符合要求,所以去左面進行二分查找//先記錄答案,然后去做左面看有沒有最優解ans = mid;r = mid-1;}else{l = mid +1;}}return ans;}int check(vector<int>& nums, int limit){int sum = 0;int ret= 1; //代表最少分幾份for(int i = 0 ;i<nums.size();i++){if(sum + nums[i] <= limit){//沒有滿 將數據吸納進來sum += nums[i];}else{//當前sum結束了,現在sum的值為當前num[i]的值ret++;sum = nums[i];}}return ret;}
};

題目三:找出第K小的數對距離

題目鏈接:719. 找出第 K 小的數對距離 - 力扣(LeetCode)

題解:

1? ? ? ? 題意數對距離就是兩數之間的絕對值差值,題目要返回第k小的數對距離。

2? ? ? ? 先看答案與給定條件之間的單調性關系,當兩數的絕對值差值越大,那么這個K值也會越大,所以存在一定的單調性關系。

3? ? ? ? 那么我們可以二分數對距離,根據題意找到最大最小的數對距離。

4? ? ? ? ?check函數我們可以傳遞mid位置的數對距離,然后返回mid位置為第幾小的位置,與給定的k進行比較,直到二分結束。

class Solution {
public:int smallestDistancePair(vector<int>& nums, int k) {//因為要找數據之間差值最大的兩個數,并且該題排序與不排序不會影響最終結果 sort(nums.begin(),nums.end());//由于上面進行了排序所以右邊界就是最大值與最小值的差值 int r = nums[nums.size() -1] - nums[0];//左邊界就是數組中最小的差值,也就是數組之間相鄰的兩個數據最小的差值int l =r;for(int i = 1;i<nums.size()-1;i++){l = min(r,nums[i]-nums[i-1]);} int ans = 0;int mid = 0;while(l<=r){mid = l+((r-l)>>1);//num為返回的第幾小的元素,與k進行比較int num = check(nums,mid);if(num >= k){//符合要求,將mid記錄,這是mid可能已經為最終答案,記錄以備候選,繼續二分看是否還有最優解 ans = mid;r = mid -1;}else{//mid不符合要求,縮小區間到mid的右面 l = mid +1;}}return ans;}//用來判斷是不是與第k小的關系,也就是返回<=mid的數對數量int check(vector<int>& nums,int mid){//這道題應用到了滑動窗口的方法 int sum = 0;int r = -1, l = 0;for(l=0;l< nums.size();l++){//從0開始存不能等于nums.size(),如果r+1 - l 的差值小于等于傳進來的差值,就r++向后走,否則就停止 while(r < l || ((r+1)<nums.size() && nums[r+1] - nums[l] <= mid)){r++;}//因為l要加了,先將區間內符合條件的數據記錄個數,L++,也就是l走之前記錄l位置處的符合條件的個數 sum += r-l;}return sum;}
};

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

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

相關文章

學習爬蟲的第二天——分頁爬取并存入表中

閱讀提示&#xff1a;我現在還在嘗試爬靜態頁面 一、分頁爬取模式 以豆瓣Top250為例&#xff1a; 基礎url:豆瓣電影 Top 250https://movie.douban.com/top250 分頁參數:?start0&#xff08;第一頁&#xff09;、?start25&#xff08;第二頁&#xff09;等 每頁顯示25條數…

第 8 章:使用更好的庫_《C++性能優化指南》_notes

使用更好的庫 第八章核心知識點解析編譯與測試建議總結優化原則重點內容&#xff1a;第一部分&#xff1a;多選題&#xff08;10題&#xff09;第二部分&#xff1a;設計題答案與解析多選題答案&#xff1a;設計題答案示例&#xff08;部分&#xff09;&#xff1a; 測試用例設…

RabbitMQ 學習整理1 - 基礎使用

項目代碼&#xff1a;RabbitMQDemo: 學習RabbitMQ的一些整理 基本概念 RabbitMQ是一種基于AMQP協議的消息隊列實現框架RabbitMQ可以用于在系統與系統之間或者微服務節點之間&#xff0c;進行消息緩存&#xff0c;消息廣播&#xff0c;消息分配以及限流消峰處理RabbitMQ-Serve…

React組件簡介

組件 在 React 中&#xff0c;組件&#xff08;Component&#xff09; 是 UI 的基本構建塊。可以把它理解為一個獨立的、可復用的 UI 單元&#xff0c;類似于函數&#xff0c;它接受輸入&#xff08;props&#xff09;&#xff0c;然后返回 React 元素來描述 UI。 組件的簡單…

Kafka消息序列化深度革命:構建高性能、高安全的自定義編碼體系

一、突破默認序列化的桎梏 1.1 原生序列化器的致命缺陷 Kafka默認提供的StringSerializer/ByteArraySerializer在復雜場景下暴露三大痛點&#xff1a; 類型安全黑洞&#xff1a;字節流缺乏元數據描述&#xff0c;消費端解析如履薄冰版本兼容困境&#xff1a;數據結構變更導致…

向量數據庫與傳統數據庫的差異

向量數據庫是一種專門設計用于高效存儲、管理和檢索**向量數據&#xff08;高維數值數組&#xff09;**的數據庫系統。它針對非結構化數據&#xff08;如圖像、文本、音頻&#xff09;的特征進行優化&#xff0c;通過將數據轉化為向量嵌入&#xff08;embeddings&#xff09;&a…

自動化框架的設計與實現

一、自動化測試框架 在大部分測試人員眼中只要沾上“框架”&#xff0c;就感覺非常神秘&#xff0c;非常遙遠。大家之所以覺得復雜&#xff0c;是因為落地運用起來很復雜&#xff1b;每個公司&#xff0c;每個業務及產品線的業務流程都不一樣&#xff0c;所以就導致了“自動化…

SpringBoot 3+ Lombok日志框架從logback改為Log4j2

r要將Spring Boot 3項目中的日志框架從Logback切換到Log4j2&#xff0c;并配置按日期滾動文件和控制臺輸出&#xff0c;請按照以下步驟操作&#xff1a; 步驟 1&#xff1a;排除Logback并添加Log4j2依賴 在pom.xml中修改依賴&#xff1a; <dependencies><!-- 排除默…

①、環境準備-主流技術(IPS/FW/主備-主主快速切換)

主流技術&(IPS/FW/主備-主主快速切換&#xff09; 一、RBM主備方案 RBM-FW-P 主配置內容介紹-注釋 remote-backup group 含義&#xff1a;定義了一個遠程備份組。這表明設備支持某種形式的遠程備份功能&#xff0c;用于在設備之間同步配置或數據。data-channel interface …

量化交通擁堵

指數&#xff1a; 基于嚴重擁堵里程比的指數和基于出行時間比的指數。 評價指標是飽和度&#xff08;VC比&#xff09;&#xff0c;它表示交通量與通行能力的比值。 飽和度可分為道路飽和度和路口飽和度。道路飽和度還會進一步分級&#xff0c;有四檔和六檔之分。 城市道路和…

PDF與Markdown的量子糾纏:一場由VLM導演的文檔界奇幻秀

緣起:當格式界的"泰坦尼克號"撞上"黑客帝國" 某個月黑風高的夜晚,在"二進制酒吧"的霓虹燈下: PDF(西裝革履地晃著威士忌): “我的每一頁都像瑞士手表般精密,連華爾街的禿鷲都為我傾倒!” Markdown(穿著帶洞的拖鞋): “得了吧老古董!…

【neo4j數據導出并在其他電腦導入】

停止服務 neo4j stop 導出 neo4j-admin database dump neo4j --to-path"C:\Users\12901\Downloads\test folder" 導入 將 .dump 文件放在一個目錄中 mkdir /root/dump-directory mv /root/neo4j.dump /root/dump-directory/ 使用包含 .dump 文件的目錄路徑作為 …

前端使用WPS WebOffice 做在線文檔預覽與編輯

先附上官網 WebOffice SDK 1、在下面這個地方找到jdk&#xff0c;然后下載 按照 2、只需要把jdk下載下來&#xff0c;放到項目中&#xff0c;然后引入到項目中就可以了&#xff0c;在wps 官網創建個應用&#xff0c;然后把appId放到代碼中就可以了&#xff0c;等待后端把回調…

跨語言微服務架構(Java、Python)——“API中臺”

文章目錄 一、引言二、系統架構概述2.1 統一單點登錄&#xff08;SSO&#xff09;與權限管理設計2.2 API中臺與數據中臺的融合2.3 跨語言適配器與 JWT 認證機制 三、技術細節與工具選型3.1 SSO 系統的選型與實現3.2 微服務架構與 API 中臺的實現3.3 跨語言適配器實現與技術難點…

DeepSeek V3-0324升級:開啟人機共創新紀元

一、技術平權&#xff1a;開源協議重構AI權力格局 DeepSeek V3選擇MIT協議開源6850億參數模型&#xff0c;本質上是一場針對技術壟斷的“數字起義”。這一決策的深層影響在于&#xff1a; 商業邏輯的重構 閉源AI公司依賴API收費的商業模式面臨根本性挑戰。當頂級模型能力可通過…

QOpenGLWidget視頻畫面上繪制矩形框

一、QPainter繪制 在QOpenGLWidget中可以繪制,并且和OpenGL的內容疊在一起。paintGL里面繪制完視頻后,解鎖資源,再用QPainter繪制矩形框。這種方式靈活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bind();//繪制視頻數據// 解綁VAOg…

3.3 Taylor公式

1.定義 1.1 taylor公式 1.2 麥克勞林公式 1.3 推論 1.4 拉格朗日余項和皮亞諾型余項 2. 例題 3.幾種特殊函數的麥克勞林展開

CEF 給交互函數, 添加控制臺是否顯示交互參數log開關

CEF 控制臺添加一函數,枚舉 注冊的供前端使用的CPP交互函數有哪些 CEF 多進程模式時,注入函數,獲得交互信息-CSDN博客 這兩篇文章,介紹了注入函數,在控制臺中顯示 各自提供的交互函數信息。 有些場景下,我們還需要更詳細的信息,比如想知道 彼此傳遞的參數, 如果每次調…

QTcpSocket多線程連接慢問題

20250325記錄 環境&#xff1a;Qt5.14.2 64位 msvc編譯 在多線程環境下&#xff0c;使用QTcpSocket實現客戶端&#xff0c;發現在少部分電腦上&#xff0c;連接時間過長&#xff0c;定時器檢查套接字狀態時&#xff0c;發現連接處于QAbstractSocket::ConnectingState狀態。 …

IntelliJ IDEA創建Maven工程

1、創建空工程 1&#xff09;創建 2&#xff09;配置JDK和Maven 2、創建Maven工程 3、Maven工程結構簡介 1&#xff09;目錄 pom.xml 2&#xff09;窗口 4、參考 08.IDEA配置本地Maven軟件_嗶哩嗶哩_bilibili