【二分查找】【滑動窗口】LeeCode2528:最大化城市的最小電量

作者推薦

【動態規劃】【廣度優先】LeetCode2258:逃離火災

本文涉及的基礎知識點

二分查找算法合集
滑動窗口

題目

給你一個下標從 0 開始長度為 n 的整數數組 stations ,其中 stations[i] 表示第 i 座城市的供電站數目。
每個供電站可以在一定 范圍 內給所有城市提供電力。換句話說,如果給定的范圍是 r ,在城市 i 處的供電站可以給所有滿足 |i - j| <= r 且 0 <= i, j <= n - 1 的城市 j 供電。
|x| 表示 x 的 絕對值 。比方說,|7 - 5| = 2 ,|3 - 10| = 7 。
一座城市的 電量 是所有能給它供電的供電站數目。
政府批準了可以額外建造 k 座供電站,你需要決定這些供電站分別應該建在哪里,這些供電站與已經存在的供電站有相同的供電范圍。
給你兩個整數 r 和 k ,如果以最優策略建造額外的發電站,返回所有城市中,最小電量的最大值是多少。
這 k 座供電站可以建在多個城市。
示例 1:
輸入:stations = [1,2,4,5,0], r = 1, k = 2
輸出:5
解釋:
最優方案之一是把 2 座供電站都建在城市 1 。
每座城市的供電站數目分別為 [1,4,4,5,0] 。

  • 城市 0 的供電站數目為 1 + 4 = 5 。
  • 城市 1 的供電站數目為 1 + 4 + 4 = 9 。
  • 城市 2 的供電站數目為 4 + 4 + 5 = 13 。
  • 城市 3 的供電站數目為 5 + 4 = 9 。
  • 城市 4 的供電站數目為 5 + 0 = 5 。
    供電站數目最少是 5 。
    無法得到更優解,所以我們返回 5 。
    示例 2:
    輸入:stations = [4,4,4,4], r = 0, k = 3
    輸出:4
    解釋:
    無論如何安排,總有一座城市的供電站數目是 4 ,所以最優解是 4 。
    參數范圍
    n == stations.length
    1 <= n <= 105
    0 <= stations[i] <= 105
    0 <= r <= n - 1
    0 <= k <= 109

分析

時間復雜度😮(logmn),其中m是可能的最大的最小電量std::accumulate(stations.begin(), stations.end(),0LL) + k

二分查找

判斷所有城市的電量能否達到mid,mid為0的時候一定可以,隨著mid增加變得不可能。求最后一個可能的mid,顯然左閉右開的二分。

Can函數

llSum記錄當前城市的最大電量
k還可以建造的電站數量
stations記錄各城市的電站數,包括新建的

如果當前城市電量不夠,則建設電站到本城市電量更好滿足要求。如果無法建造則失敗。選擇能給本城市供電的城市中最右的城市建造電站。

代碼

核心代碼

class Solution {
public:long long maxPower(vector<int>& stations, int r, int k) {m_c = stations.size();long left = 0, right = std::accumulate(stations.begin(), stations.end(),0LL) + k  + 1;while (right - left > 1){const auto mid = left + (right - left) / 2;if (Can(stations, mid, r, k)){left = mid;}else{right = mid;}}return left;}bool Can(vector<int> stations, const long long llMin, const int r,int k){long long llSum = 0;for (int i = 0; i < r; i++){//stations[r]下面循環加llSum += stations[i];}for (int i = 0; i < stations.size(); i++){const int iDel = i - r - 1;if (iDel >= 0){llSum -= stations[iDel];}const int iAdd = i + r;if (iAdd < m_c){llSum += stations[iAdd];}if (llSum < llMin){const long long llNeed = llMin - llSum;if (k < llNeed){return false;}k-= llNeed;llSum = llMin;stations[min(iAdd, m_c - 1)] += llNeed;}}return true;}int m_c;
};

測試用例

template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){assert(v1[i] == v2[i]);}
}template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}int main()
{vector<int> stations;int r, k;{Solution slu;stations = { 1, 2, 4, 5, 0 };r = 1, k = 2;auto res = slu.maxPower(stations, r, k);Assert(5LL, res);}{Solution slu;stations = { 4,4,4,4 };r = 0, k = 3;auto res = slu.maxPower(stations, r, k);Assert(4LL, res);}//CConsole::Out(res);
}

擴展閱讀

視頻課程

有效學習:明確的目標 及時的反饋 拉伸區(難度合適),可以先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771

如何你想快

速形成戰斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176

相關下載

想高屋建瓴的學習算法,請下載《喜缺全書算法冊》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想對大家說的話
聞缺陷則喜是一個美好的愿望,早發現問題,早修改問題,給老板節約錢。
子墨子言之:事無終始,無務多業

。也就是我們常說的專業的人做專業的事。 |
|如果程序是一條龍,那算法就是他的是睛|

測試環境

操作系統:win7 開發環境: VS2019 C++17
或者 操作系統:win10 開發環境: VS2022 C++17
如無特殊說明,本算法用**C++**實現。

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

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

相關文章

Java學習總結

1. Java集合體系框架 java.util中包含 Java 最常用的the collections framework。 Java集合類主要由兩個根接口Collection和Map派生出來的。 Collection 接口派生出了三個子接口List、Set、Queue。Map 接口 因此Java集合大致也可分成List、Set、Queue、Map四種接口體系。 …

CDH6.3.2安裝

文章目錄 [toc]一、CM簡介1、ClouderaManager的概念2、ClouderaManager的功能3、ClouderaManager的架構 二、準備清單1、部署步驟2、集群規劃3、軟件環境準備 三、安裝清單1、操作系統iso包2、JDK包3、MySQL包4、CM和CDH包5、部署ansible 四、基礎環境準備1、配置網絡2、配置ho…

Java項目開發,業務比較復雜如何減少bug

Java項目開發&#xff0c;業務比較復雜如何減少bug 當Java開發工作涉及復雜業務時&#xff0c;可以采取以下方法來減少bug的數量&#xff1a; 1、深入了解業務需求 充分了解業務需求&#xff0c;與業務人員進行充分的溝通和交流&#xff0c;確保對需求的理解正確。在需求分析…

el-collapse 默認展開第一個(實測有效)

<el-collapse accordion v-model"activeCollapse"> <el-collapse-item v-for"(item, index) in assetList" :name"index" :key"item.id" > 我這個是通過循環, 只需要v-model 綁定的值和 name 相等,就可以實現展開 然后就…

重新認識Word——給圖、表、公式等自動編號

重新認識Word——給圖、表、公式等自動編號 給圖增加題注題注失敗的情況給圖添加“如圖xx-xx所示” 給公式插入題注第一步——先加題注第二步——設置兩個制表符 解決題注“圖一-1”的問題 前面我們已經學習了如何引用多級列表自動編號了&#xff0c;現在我們有第二個問題&…

大數據湖體系規劃與建設方案:PPT全文51頁,附下載

關鍵詞&#xff1a;大數據解決方案&#xff0c;數據湖解決方案&#xff0c;數據數倉建設方案&#xff0c;大數據湖建設規劃&#xff0c;大數據湖發展趨勢 一、大數據湖體系規劃與建設背景 在傳統的企業信息化建設中&#xff0c;各個業務系統通常是獨立建設的&#xff0c;導致…

學習筆記10——Mysql的DDL語句

學習筆記系列開頭慣例發布一些尋親消息 鏈接&#xff1a;https://baobeihuijia.com/bbhj/contents/3/197161.html 數據庫創建&#xff1a; CREATE DATABASE books&#xff1b; CREATE DATABASE IF NOT EXISTS books;更改字符集 ALTER DATABASE books CHARACTER SET gbk;庫的刪…

FFmpeg之AVFilterLink

這個結構體主要是用來link兩個filter的,它存在于每個AVFilterContext中 struct AVFilterContext {const AVClass *av_class; ///< needed for av_log() and filters common optionsconst AVFilter *filter; ///< the AVFilter of which this is an inst…

XX.push is not a function

錯誤通常發生在嘗試在非數組類型的變量上使用push方法 問題&#xff1a;定義了數組類型&#xff0c;用push方法一直報錯&#xff0c;感覺哪里都沒毛病 原因&#xff1a;雖然剛開始定義了數組類型&#xff0c;但可能是因為在代碼的某個地方將其重新賦值為了非數組類型的值。 …

【計算機網絡基礎2】IP地址和子網掩碼

1、IP地址 網絡地址 IP地址由網絡號&#xff08;包括子網號&#xff09;和主機號組成&#xff0c;網絡地址的主機號為全0&#xff0c;網絡地址代表著整個網絡。 廣播地址 廣播地址通常稱為直接廣播地址&#xff0c;是為了區分受限廣播地址。 廣播地址與網絡地址的主機號正…

Mybatis-Plus基礎之框架基礎

文章目錄 Mybatis-Plus 框架基礎引入 maven 依賴定義實體類&#xff0c;并標注注解定義 Mapper 接口&#xff0c;要求繼承自特定父接口使用 MapperScan 注解&#xff0c;掃描 mapper 接口所在位置驗證 Mybatis-Plus 框架基礎 MyBatis-Plus 是 MyBatis 的一種增強框架&#xff…

C語言常用字符串

目錄 1.什么是字符串 2.如何定義字符串 第3和第4定義的區別&#xff1a;3是字符串變量&#xff0c;4是字符串常量&#xff0c;不予許被修改 3.strlen和sizeof的區別 4.地址分配&#xff08;malloc,realloc,free,memset&#xff09; 案例 5.字符串拷貝(strcpy,strncpy) …

kafka創建新topic

創建topic bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic mytopic bin/kafka-topics.sh //bin目錄下的.sh --create --bootstrap-server //固定寫法 localhost:9092 //ip端口 --replication-fac…

vue 集成行政區域選擇插件region和數據回顯

故事&#xff1a;最近&#xff0c;項目需要進行行政區域圍欄的繪制&#xff0c;由于老舊項目是利用js保存全國行政區域地址和編碼&#xff0c;在選擇器select進行匹配顯示&#xff0c;但此方法復雜&#xff0c;因此選擇集成區域插件region 步驟一&#xff1a;用命令安裝region…

JS實現返利網注冊系統(網頁數據驗證)

主代碼 <!DOCTYPE HTMLPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><title>返利網注冊</tit…

品牌線下店鋪的查價方式

不同于電商平臺&#xff0c;線下店鋪會更傳統&#xff0c;產品定價除了受品牌規則的約束&#xff0c;同樣也與門店實際銷量和促銷有關&#xff0c;當遇到地方活動&#xff0c;促銷力度大了&#xff0c;價格難免會與品牌要求相差異&#xff0c;但是管控渠道&#xff0c;包含線上…

無法將“mvn”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫,如果包括路徑,請確保路徑正確,然后再試一次。

這個錯誤表明系統無法找到mvn命令。這通常是因為Maven沒有正確安裝或者Maven的安裝路徑沒有添加到系統的環境變量中。你需要確保Maven已經正確安裝&#xff0c;并且將Maven的安裝路徑添加到系統的環境變量中。 你可以按照以下步驟在Windows上安裝Maven&#xff1a; 1. 訪問Mave…

痤瘡分割 實驗心路歷程

數據集的制作 將labelme生成的標注文件記普通的json文件轉成coco數據集格式的json文件 圖像分辨率過大 如果不做任何調整&#xff1a; 會出現“killed”的報錯&#xff0c;表示圖片像素過大&#xff0c;顯卡內存不夠&#xff0c;無法支撐訓練 顯卡 換成更高性能的顯卡&am…

小紅書運營方式,需要搭建自己的選題庫

無論是個人還是專業號&#xff0c;面臨最大的問題是持續創作的能力。如何能夠持續發文&#xff0c;同時還能圍繞自己的業務輸出內容。很多賬號斷更就是不知道該更新什么&#xff0c;久而久之賬號斷更。 一般來說這種情況&#xff0c;就需要建立自己的選題庫&#xff0c;通過系…

FPGA高端項目:UltraScale GTH + SDI 視頻解碼,SDI轉DP輸出,提供2套工程源碼和技術支持

目錄 1、前言免責聲明 2、相關方案推薦我這里已有的 GT 高速接口解決方案我目前已有的SDI編解碼方案 3、詳細設計方案設計框圖3G-SDI攝像頭LMH0384均衡EQUltraScale GTH 的SDI模式應用UltraScale GTH 基本結構參考時鐘的選擇和分配UltraScale GTH 發送和接收處理流程UltraScale…