二分答案之最大化最小值

參考資料來源靈神在力扣所發的題單,僅供分享學習筆記和記錄,無商業用途。

核心思路:本質上是求最大

應用場景:在滿足條件的最小值區間內使最大化

檢查函數:保證數據都要大于等于答案

補充:為什么需要滿足大于等于答案的元素而不是等于答案的元素,因為二分會收斂至最優結果

模板:

    bool check() //檢查條件int smallestDivisor(vector<int>& nums, int threshold) {while(l<r){mid=l+((r-l)>>1)+1;if(check(start,d,mid)) l=mid; //滿足條件,增大區間嘗試找到更好數據else r=mid-1;  //不滿足條件,縮小區間積極找到合法答案}return l;

力扣題單練習(靈神題單中摘取題目)

3281. 范圍內整數的最大得分

題意:

給定一個整數數組表示有n個區間[start[i], start[i] + d]。

要求在每個區間內選取一個數,然后這些數據進行兩兩組合進行絕對差計算,以最小絕對差為結果

要求怎樣在區間內取數讓結果最大化,也就是最小絕對差最大化

思路:

合理右邊界:選取整數數組中最小值和最大值+d獲得最大絕對差

檢查函數:判斷當前區間對每個區間各取的整數的絕對差是否都大于等于答案。

貪心策略:當區間左邊界+答案,小于等于下一個區間右邊界說明絕對差值大于等于答案,當前成立。

貪心補充:

因為是升序,所以滿足了后一個區間,后面所有區間絕對差值只會越來越大,所以當前成立。

采用當前區間左邊界是因為要讓它盡可能落到合法區間,如果它都沒有滿足,當前區間內所有數據都不會滿足。

反之說明當前答案不成立,因為至少有一組區間的絕對差小于答案。

class Solution {
public://檢查函數:判斷當前區間對每個區間各取的整數的絕對差是否都大于等于答案。//貪心策略:當區間左邊界+答案,小于等于下一個區間右邊界說明絕對差值大于等于答案,當前成立。//因為是升序,所以滿足了后一個區間,后面所有區間絕對差值只會越來越大,所以當前成立。//采用當前區間左邊界是因為要讓它盡可能落到合法區間,如果它都沒有滿足,當前區間內所有數據都不會滿足//反之說明當前答案不成立,因為至少有一組區間的絕對差小于答案。bool check(vector<int>& nums, int d, int ret){long long x = LLONG_MIN;for(long long k:nums){x=max(k,x+ret);if(x>k+d) return false;  //超出下一個區間右邊界說明至少存在一組區間的絕對差小于答案,不滿足}return true;}int maxPossibleScore(vector<int>& start, int d) {//題意:給定一個整數數組表示有n個區間[start[i], start[i] + d]。//要求在每個區間內選取一個數,然后這些數據進行兩兩組合進行絕對差計算,以最小絕對差為結果//要求怎樣在區間內取數讓結果最大化,也就是最小絕對差最大化//合理右邊界:選取整數數組中最小值和最大值+d獲得最大絕對差sort(start.begin(),start.end());int l=0,r=start[start.size()-1]-start[0]+d,mid;while(l<r){mid=l+((r-l)>>1)+1;if(check(start,d,mid)) l=mid;else r=mid-1;}return l;}
};

2517. 禮盒的最大甜蜜度

題意:

給定一個正整數數組,要求你選取k個元素,并求出任意兩元素絕對差的最小值,要求最小值最大化

思路:

合理右邊界:最大可能的差值是最大值減最小值

檢查函數:選取排序后第一個元素,判斷是否有k個滿足大于等于答案的元素

貪心策略:如果最小值作為選取值都沒有找到滿足條件的k個元素,其他更不可能

class Solution {
public://檢查函數:選取排序后第一個元素,判斷是否有k個滿足大于等于答案的元素//為什么需要滿足大于等于答案的元素而不是等于答案的元素,因為二分會收斂至最優結果//貪心策略:如果最小值作為選取值都沒有找到滿足條件的k個元素,其他更不可能bool check(vector<int>& nums, int k, int ret){int cnt=1; //選取數據的數量int last=nums[0];  //當前選取元素for(int i=1;i<nums.size();i++){if(nums[i]-last>=ret){last=nums[i];cnt++;if(cnt==k) return true; //當滿足條件的元素等于k個時,說明答案成立}}return false;}int maximumTastiness(vector<int>& price, int k) {//題意:給定一個正整數數組,要求你選取k個元素,并求出任意兩元素絕對差的最小值,要求最小值最大化//合理右邊界:最大可能的差值是最大值減最小值sort(price.begin(),price.end());int l=0,r=price.back()-price[0],mid;while(l<r){mid=l+((r-l)>>1)+1;if(check(price,k,mid)) l=mid;else r=mid-1;}return l;}
};

2812. 找出最安全路徑

題意:

給定一個大小為 n x n 的二維矩陣 grid。

grid[r][c] = 1 ,則表示一個存在小偷的單元格。grid[r][c] = 0 ,則表示一個空單元格

你最開始位于單元格 (0, 0),可以上下左右移動。返回所有通向單元格 (n - 1, n - 1) 的路徑中的 最大安全系數 。

安全系數 定義為:從路徑中任一單元格到矩陣中任一小偷所在單元格的 最小 曼哈頓距離。

兩個單元格 (a, b) 和 (x, y) 之間的 曼哈頓距離 等于 | a - x | + | b - y | 。

思路:

合理右邊界:

安全系數定義為路徑上任意點到最近小偷的最小曼哈頓距離。

對于一個n×n的矩陣,任意兩點間的最大曼哈頓距離為2n-2(從左上角到右下角)。但由于小偷可能位于矩陣內部,實際的安全系數上限會更小。

在最壞情況下,小偷位于四個角落,安全系數最大為n-1,此時右邊界設為n(即矩陣行長度)可以覆蓋所有可能的安全系數。

檢查函數:判斷是否有一條到達終點且路徑上的單元格到小偷單元格距離大于等于答案的路徑

class Solution {
public:int d[4][2]={0,1,0,-1,-1,0,1,0};//檢查函數:判斷是否有一條到達終點且路徑上的單元格到小偷單元格距離大于等于答案的路徑bool check(vector<vector<int>>& dist, int k){if(dist[0][0]<k) return false;  vector<vector<bool>> vis(dist.size(),vector<bool>(dist[0].size(),false)); //去重queue<pair<int,int>> q;vis[0][0]=true;q.push({0,0});while(!q.empty()){  //廣搜:在所有到達終點的路徑中找到一條滿足條件的路徑auto [x,y]=q.front();q.pop();for(int m=0;m<4;m++){int i=x+d[m][0];int j=y+d[m][1];if( i<0 || i>=dist.size() || j<0 || j>=dist[0].size() || dist[i][j]<k || vis[i][j]) continue;if(i==dist.size()-1 && j==dist[0].size()-1) return true;vis[i][j]=true;q.push({i,j});}}return false;}int maximumSafenessFactor(vector<vector<int>>& grid) {//題意:給定一個大小為 n x n 的二維矩陣 grid。//grid[r][c] = 1 ,則表示一個存在小偷的單元格。grid[r][c] = 0 ,則表示一個空單元格//你最開始位于單元格 (0, 0),可以上下左右移動。返回所有通向單元格 (n - 1, n - 1) 的路徑中的 最大安全系數 。//安全系數 定義為:從路徑中任一單元格到矩陣中任一小偷所在單元格的 最小 曼哈頓距離。//兩個單元格 (a, b) 和 (x, y) 之間的 曼哈頓距離 等于 | a - x | + | b - y | 。//合理右邊界:安全系數定義為路徑上任意點到最近小偷的最小曼哈頓距離。//對于一個n×n的矩陣,任意兩點間的最大曼哈頓距離為2n-2(從左上角到右下角)。但由于小偷可能位于矩陣內部,實際的安全系數上限會更小。//在最壞情況下,小偷位于四個角落,安全系數最大為n-1,此時右邊界設為n(即矩陣行長度)可以覆蓋所有可能的安全系數。vector<vector<int>> dist(grid.size(),vector<int>(grid[0].size(),-1));queue<pair<int,int>> q;//記錄小偷所在單元格的位置,并重置距離for(int i=0;i<grid.size();i++){for(int j=0;j<grid[0].size();j++){if(grid[i][j]==1){q.push({i,j});dist[i][j]=0;}}}//計算每個普通單元格距離小偷單元格的最小距離while(!q.empty()){auto [x,y]=q.front();q.pop();for(int m=0;m<4;m++){int i=x+d[m][0];int j=y+d[m][1];if(i<0 || i>=dist.size() || j<0 || j>=dist[0].size()) continue;if(dist[i][j]==-1){dist[i][j]=dist[x][y]+1;q.push({i,j});}}}int l=0,r=grid[0].size(),mid;while(l<r){mid=l+((r-l)>>1)+1;if(check(dist,mid)) l=mid;else r=mid-1;}return l;}
};

2528. 最大化城市的最小電量

題意:

給定一個整數數組表示每個城市的供電站數量和影響范圍。可以額外添加k座供電站

每個供電站可以在一定范圍內給所有城市提供電力。要求城市最小電量最大化

思路:

合理右邊界:城市最小電量+k為極限邊界

檢查函數:判斷添加k個供電站是否能使數組元素都>=答案

貪心策略:如果當前城市電量小于答案,需要在當前位置+r,也就是右邊界添加。這樣能保證盡可能的輻射更多的城市

滑動窗口:維護區間內添加的發電站的總電量

class Solution {
public://檢查函數:判斷添加k個供電站是否能使數組元素都>=答案//貪心策略:如果當前城市電量小于答案,需要在當前位置+r,也就是右邊界添加。這樣能保證盡可能的輻射更多的城市//滑動窗口:維護區間內添加的發電站的總電量bool check(vector<long long>& nums, int r, int k, long long m){long long cnt=k;  //格外發電站建立數量long long buff=0; //當前位置+r區間內格外建造的發電站的總電量int n=nums.size();vector<long long> ans(n,0);for(int i=0;i<n;i++){if(i-r-1>=0) buff-=ans[i-r-1];  //維護一個定長滑窗long long total=buff+nums[i];if(total>=m) continue;long long need=m-total;if(cnt<need) return false;ans[min(i+r,n-1)]+=need;buff+=need;cnt-=need;}return true;}long long maxPower(vector<int>& stations, int r, int k) {//題意:給定一個整數數組表示每個城市的供電站數量和影響范圍。可以額外添加k座供電站//每個供電站可以在一定范圍內給所有城市提供電力。要求城市最小電量最大化//合理右邊界:城市最小電量+k為極限邊界int n=stations.size();vector<long long> buff(n+1,0);for(int i=0;i<n;i++) buff[i+1]=buff[i]+stations[i]; //計算前綴和//根據每個城市的供電站數量和影響范圍獲取城市的電量vector<long long> ans(n);long long min_num=LLONG_MAX;for(int i=0;i<n;i++){int left=max(i-r,0);int right=min(i+r,n-1);ans[i]=buff[right+1]-buff[left];min_num=min(min_num,ans[i]);}//二分答案long long head=0,tail=min_num+k,mid;while(head<tail){mid=head+((tail-head)>>1)+1;if(check(ans,r,k,mid)) head=mid;else tail=mid-1;}return head;}
};

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

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

相關文章

OCR 賦能檔案數字化:讓沉睡的檔案 “活” 起來

添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09;企業產品檔案包含設計圖紙、檢測報告、生產記錄等&#xff0c;傳統數字化僅靠掃描存檔&#xff0c;后續檢索需人工逐份翻閱&#xff0c;效率極低。?OCR 產品檔案解決方案直擊痛點&#xff1a;通過智能識別技…

力扣118.楊輝三角

思路1.新建一個vector的vector2.先把空間開出來&#xff0c;然后再把里面的值給一個個修改開空間的手段&#xff1a;new、構造函數、reserve、resize因為我們之后要修改里面的數據&#xff0c;這就意味著我們需要去讀取這個數據并修改&#xff0c;如果用reserve的話&#xff0c…

Python 網絡爬蟲 —— 提交信息到網頁

一、模塊核心邏輯“提交信息到網頁” 是網絡交互關鍵環節&#xff0c;借助 requests 庫的 post() 函數&#xff0c;能模擬瀏覽器向網頁發數據&#xff08;如表單、文件 &#xff09;&#xff0c;實現信息上傳&#xff0c;讓我們能與網頁背后的服務器 “溝通”&#xff0c;像改密…

SpringMVC4

一、SpringMVC 注解與項目開發流程1.1注解的生命周期- Target、Retention 等元注解&#xff1a;- Target(ElementType.TYPE) &#xff1a;說明這個注解只能用在類、接口上。- Retention(RetentionPolicy.RUNTIME) &#xff1a;說明注解在運行時保留&#xff0c;能通過反射獲取…

數據結構排序算法總結(C語言實現)

以下是常見排序算法的總結及C語言實現&#xff0c;包含時間復雜度、空間復雜度和穩定性分析&#xff1a;1. 冒泡排序 (Bubble Sort)思想&#xff1a;重復比較相鄰元素&#xff0c;將較大元素向后移動。 時間復雜度&#xff1a;O(n)&#xff08;最好O(n)&#xff0c;最壞O(n)) 空…

嵌入式學習-PyTorch(2)-day19

很久沒有學了&#xff0c;期間打點滴打了一個多星期&#xff0c;太累了&#xff0c;再加上學了一下Python語法基礎&#xff0c;再終于開始重新學習pytorchtensorboard 的使用import torch from torch.utils.tensorboard import SummaryWriter writer SummaryWriter("logs…

Prompt Engineering 快速入門+實戰案例

資料來源&#xff1a;火山引擎-開發者社區 引言 什么是 prompt A prompt is an input to a Generative AI model, that is used to guide its output. Prompt engineering is the process of writing effective instructions for a model, such that it consistently generat…

「源力覺醒 創作者計劃」_文心開源模型(ERNIE-4.5-VL-28B-A3B-PT)使用心得

文章目錄背景操作流程開源模型選擇算力服務器平臺開通部署一個算力服務器登錄GPU算力服務器進行模型的部署FastDeploy 快速部署服務安裝paddlepaddle-gpu1. 降級沖突的庫版本安裝fastdeploy直接部署模型&#xff08;此處大約花費15分鐘時間&#xff09;放行服務端口供公網訪問最…

P10719 [GESP202406 五級] 黑白格

題目傳送門 前言&#xff1a;不是這樣例有點過分了哈&#xff1a; 這是我沒考慮到無解的情況的得分&#xff1a; 這是我考慮了的得分&#xff1a; 總而言之&#xff0c;就是一個Subtask 你沒考慮無解的情況&#xff08;除了Subtask #0&#xff09;,就會WA一大片,然后這個Subt…

AWS RDS PostgreSQL可觀測性最佳實踐

AWS RDS PostgreSQL 介紹AWS RDS PostgreSQL 是亞馬遜云服務&#xff08;AWS&#xff09;提供的托管型 PostgreSQL 數據庫服務。托管服務&#xff1a;AWS 管理數據庫的底層基礎設施&#xff0c;包括硬件、操作系統、數據庫引擎等&#xff0c;用戶無需自行維護。高性能&#xff…

C++——set,map的模擬實現

文章目錄前言紅黑樹的改變set的模擬實現基本框架迭代器插入源碼map模擬實現基礎框架迭代器插入賦值重載源碼測試代碼前言 set&#xff0c;map底層使用紅黑樹這種平衡二叉搜索樹來組織元素 &#xff0c;這使得set, map能夠提供對數時間復雜度的查找、插入和刪除操作。 下面都是基…

LabVIEW液壓機智能監控

?基于LabVIEW平臺&#xff0c;結合西門子、研華等硬件&#xff0c;構建液壓機實時監控系統。通過 OPC 通信技術實現上位機與 PLC 的數據交互&#xff0c;解決傳統監控系統數據采集滯后、存儲有限、參數調控不便等問題&#xff0c;可精準采集沖壓過程中的位置、速度、壓力等參數…

15. 什么是 xss 攻擊?怎么防護

總結 跨站腳本攻擊&#xff0c;注入惡意腳本敏感字符轉義&#xff1a;“<”,“/”前端可以抓包篡改主要后臺處理&#xff0c;轉義什么是 XSS 攻擊&#xff1f;怎么防護 概述 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站腳本攻擊&#xff09;是一種常見的 Web 安全…

更換docker工作目錄

使用環境 由于默認系統盤比較小docker鏡像很容易就占滿&#xff0c;需要掛載新的磁盤修改docker的默認工作目錄 環境&#xff1a;centos7 docker默認工作目錄: /var/lib/docker/ 新的工作目錄&#xff1a;/home/docker-data【自己手動創建&#xff0c;一般掛在新加的磁盤下面】…

算法學習筆記:26.二叉搜索樹(生日限定版)——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

二叉搜索樹&#xff08;Binary Search Tree&#xff0c;簡稱 BST&#xff09;是一種特殊的二叉樹&#xff0c;因其高效的查找、插入和刪除操作&#xff0c;成為計算機科學中最重要的數據結構之一。BST 的核心特性是 “左小右大”&#xff0c;這一特性使其在數據檢索、排序和索引…

共生型企業:駕馭AI自動化(事+AI)與人類增強(人+AI)的雙重前沿

目錄 引言&#xff1a;人工智能的雙重前沿 第一部分&#xff1a;自動化范式&#xff08;事AI&#xff09;——重新定義卓越運營 第一章&#xff1a;智能自動化的機制 第二章&#xff1a;自動化驅動的行業轉型 第三章&#xff1a;自動化的經濟演算 第二部分&#xff1a;協…

TypeScript的export用法

在 TypeScript 中&#xff0c;export 用于將模塊中的變量、函數、類、類型等暴露給外部使用。export 語法允許將模塊化的代碼分割并在其他文件中導入。 1. 命名導出&#xff08;Named Export&#xff09; 命名導出是 TypeScript 中最常見的一種導出方式&#xff0c;它允許你導出…

數據結構-2(鏈表)

一、思維導圖二、鏈表的反轉def reverse(self):"""思路&#xff1a;1、設置previous_node、current、next_node三個變量,目標是將current和previous_node逐步向后循環并逐步進行反轉,知道所有元素都被反轉2、但唯一的問題是&#xff1a;一旦current.next反轉為向…

ros2 標定相機

一個終端執行&#xff1a; ros2 run image_tools cam2image --ros-args -p width:640 -p height:480 -p frequency:30.0 -p device_id:-1 -r /image:/camera/image_raw另一個終端執行&#xff1a;8x6 是格子角點數量&#xff0c;0.028是格子尺寸 ros2 run camera_calibration …

IsaacLab學習記錄(二)

二、導入并訓練自己的機器人1、urdf等其他格式轉usd&#xff08;工具在./scrips/tools/&#xff09;???維度????URDF (Unified Robot Description Format)????USD (Universal Scene Description)????定位??機器人模型描述標準&#xff08;僅描述單機器人&…