LeetCode熱題 42.接雨水

題目

思路:

通過畫圖觀察我們其實可以很容易發現,每個柱子接多少水由這個地方左邊最高的柱子和右邊最高的柱子確定,因為總要形成一個坑嘛,然后就能接著確定:

當前柱子接水量 = min(左邊最高柱子的高度, 右邊最高柱子的高度) ? 當前柱子高度

那么代碼就很簡單了:
int len = height.size();if (len < 3) return 0;  //  簡單優化一下,如果小于3個柱子就形成不了坑,接不了水vector<int> left(len), right(len);  //  用兩個數組保存每個位置的左右兩邊最高柱子的高度left[0] = height[0];  //  第一個柱子的左邊最高是自己for (int i = 1; i < len; i ++ ){left[i] = max(height[i], left[i - 1]);  //  比較 左邊最高柱子的高度和自己}right[len - 1] = height[len - 1];  //  最右邊的柱子 右邊最高的柱子高度是自己for (int i = len - 2; i >= 0; i --){right[i] = max(height[i], right[i + 1]);}int ans = 0;  //  累加接水量for (int i = 0; i < len; i ++ ){ans += min(left[i], right[i]) - height[i];}return ans;

單調棧寫法:

上面是從每一列計算每根柱子的接水量,當然也可以從行計算。
這里有個算法 單調棧

我們確保這個棧是遞減的,遍歷每個柱子i,如果這個柱子比棧頂矮,那就讓這個柱子進棧,這里對于i來說已經有了左邊的墻,右邊的墻還沒來,我們繼續遍歷。 當遍歷到柱子 i 高度大于棧頂柱子的高度,那柱子 i 就是右墻了,此時棧頂柱子就是那個接水坑的坑底。

怎么計算接水量呢?

我們先把坑底彈出棧,然后計算 寬 w = 此時柱子 i 的下標 - 棧頂柱子的下標 - 1
再計算 高 d = min(棧頂高度,柱子 i 的高度) - 坑底的高度
最后 寬 * 高 就是接水量了

當然不要忘記把 柱子 i 進棧,因為他可能是后面柱子的左墻。

下面是代碼:

stack<int> s;               // 單調遞減 棧
int ans = 0;                // 接水量
int n = height.size();    for (int i = 0; i < n; ++i) {                       // 順序掃描while (!s.empty() && height[i] > height[s.top()]) {  // 當前柱子比棧頂高  那么 棧頂就是坑底int temp = s.top();   //  坑底柱子的下標s.pop();              // 先把坑底彈出去,后面才能看到左邊界if (s.empty()) break; // 棧空了說明左邊沒墻,跳過int l = s.top();      // 新棧頂是左墻下標int w = i - l - 1;    // 水層寬度計算int d = min(height[i], height[l]) - height[temp]; // 水層深度計算ans += w * d;         // 一次性把這一整層水全部累加}s.push(i);                // 把當前柱子下標壓進棧
}return ans;                  

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

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

相關文章

PostgreSQL與Greenplum數據庫的編程語言連接

編程語言連接數據庫 目前數據庫一般支持HA的連接&#xff0c;即一個Coordinator內的一個節點異常后會鏈接到另外的一個節點&#xff0c;不會影響業務的正常運行。在JDBC配置時需要采用 高可用鏈接字符串(Connection URL/DSN) 的方式連接。適用于不同的編程語言中使用&#xff…

后端(JDBC)學習筆記(CLASS 1):基礎篇(一)

一、引言1、數據的存儲開發java程序的時候&#xff0c;數據都是存儲在內存中&#xff0c;屬于臨時存儲&#xff0c;當程序停止或重啟時&#xff0c;內存中的數據就丟失了。為了解決數據的長期存儲問題&#xff0c;有如下解決方案&#xff1a;1、數據通過I/O流技術&#xff0c;存…

卷對卷(Roll-to-Roll,R2R)技術的應用領域和技術進展

目錄&#xff1a;第一節&#xff1a;卷對卷技術及其應用領域和工藝要求一、卷對卷技術發展現概述二、卷對卷研發和規模化應用難點重點和發展趨勢三、卷對卷工藝主要應用領域及工藝要求第二節&#xff1a;卷對卷生產工藝參數及質量控制四、卷對卷生產工藝控制參數和條件五、卷對…

【Ansible】管理變量和事實知識點

1.Ansible變量名由什么組成&#xff1f;答&#xff1a;變量名必須以字母開頭&#xff0c;且只能含有字母、數字和下劃線。2.定義變量的方法及變量的優先級&#xff1f;答&#xff1a;按優先級從低到高排列: 在清單中定義的組變量 < 在清單或playbook所在目錄的group_vars子目…

基于SpringBoot的天氣預報系統的設計與實現

源碼鏈接&#xff1a;點擊下載源碼 相關文檔&#xff1a;點擊下載相關文檔 摘 要 隨著科技的飛速發展和人們生活水平的不斷提高&#xff0c;天氣預報已成為現代社會不可或缺的一部分。無論是日常生活出行、農業生產安排&#xff0c;還是航空、海運等交通領域&#xff0c;準確…

算法(keep learning)

基礎算法 背模板加刷題 排序快排 主要思想&#xff1a;分治 第一步&#xff1a;確認一個分界點&#xff0c;比如起點&#xff0c;中間點&#xff08;分界點&#xff09;&#xff0c;末點第二步&#xff1a;調整區間&#xff0c;使得第一個區間的數都小于等于分界點&#xff0c;…

Django項目架構

背景&#xff1a;很多人寫 Django 時容易“什么都往 views 里塞”&#xff0c;結果項目一大就亂套了。需要把 視圖層 / 業務層 / 數據層 等職責清晰分出來。圖解說明Client&#xff1a;瀏覽器 / App / 前端調用 API。urls.py&#xff1a;定義 API 路由&#xff0c;把請求分發到…

MySQL】從零開始了解數據庫開發 --- 表的操作

永遠記住&#xff0c;你的存在是有意義的&#xff0c; 你很重要&#xff0c; 你是被愛著的&#xff0c; 而且你為這個世界帶來了無可取代的東西。 -- 麥克西 《男孩、鼴鼠、狐貍和馬》-- 從零開始了解數據庫開發創建數據表查看表結構修改數據表結構重命名表復制表刪除表今天我們…

MySQL底層架構設計原理詳細介紹

文章目錄一、MySQL體系結構概覽二、連接層&#xff08;Connection Layer&#xff09;1. 連接器&#xff08;Connectors&#xff09;2. 連接池&#xff08;Conncction Pool&#xff09;三、服務層&#xff08;Server Layer&#xff09;1. SQL接口組件&#xff08;SQL Interface&…

QB/T 4674-2021 汽車內裝飾用聚氨酯束狀超細纖維合成革檢測

汽車內飾品聚氨酯束狀超細纖維合成革是指以海島型雙組份或多組分纖維加工成飛織造布&#xff0c;再經水性聚氨酯樹脂或溶劑型聚氨酯樹脂浸漬、濕法凝固、溶劑或堿液萃取及后整理等工藝制成的汽車內裝飾皮革。QB/T 4674-2021 汽車內裝飾用聚氨酯束狀超細纖維合成革檢測項目測試項…

QML和Qt Quick

QML和Qt Quick QML 和 Qt Quick 是 Qt 框架中緊密相關但概念不同的兩個部分&#xff0c;它們之間的關系可以用如下方式清晰說明&#xff1a; 核心區別概覽??特性????QML????Qt Quick????本質??聲明式編程??語言??基于 QML 的??框架/庫????作用??定…

JavaScript 結構型設計模式詳解

1. 代理模式1.1. 使用場景代理模式在不改變原始對象的前提下&#xff0c;通過代理對象控制對其訪問&#xff0c;通常用于權限控制、延遲加載、遠程調用等場景。在前端開發中&#xff0c;可以通過代理模式對網絡請求、緩存機制等進行控制。1.2. 代碼實現class ApiService {reque…

攝像頭模塊在運動相機中的特殊應用

運動相機作為記錄高速運動場景的專用設備&#xff0c;其攝像頭模塊的設計與普通消費電子產品存在顯著差異。根據行業資料和技術發展&#xff0c;攝像頭模塊在運動相機中的特殊應用主要體現在以下五個維度&#xff1a;一、極端環境適應性設計運動相機的攝像頭模塊針對戶外運動場…

SpringBoot + MinIO/S3 文件服務實現:FileService 接口與 FileServiceImpl 詳解

在企業項目中&#xff0c;文件上傳和管理是非常常見的需求。本文基于 芋道源碼 的實現&#xff0c;介紹如何封裝一個通用的 文件服務 FileService&#xff0c;支持&#xff1a;文件上傳&#xff08;保存數據庫記錄 存儲文件到 S3/MinIO 等對象存儲&#xff09;文件下載與刪除文…

Oracle RAC認證矩陣:規避風險的關鍵指南

RAC Certification Matrix&#xff08;RAC認證矩陣&#xff09; 是Oracle官方發布的硬件、軟件與操作系統兼容性清單&#xff0c;明確規定了哪些平臺、組件和版本可以正式支持Oracle RAC&#xff08;Real Application Clusters&#xff09;的部署。它是搭建或升級RAC環境時必須…

【自然語言處理與大模型】如何通過微調來agent性能?

雖然大模型本身具備一定的指令理解和工具調用潛力&#xff0c;但在實際應用中&#xff0c;尤其是在復雜或專業領域&#xff0c;往往需要通過微調來提升Agent的工具調用能力。問題一&#xff1a;基座模型無法準確識別或選擇特定領域的工具當Agent需要在醫療、金融、法律、工業控…

在 Keil 中將 STM32 工程下載到 RAM 進行調試運行

在 Keil 中將 STM32 工程下載到 RAM 進行調試運行 在使用 STM32 進行調試時&#xff0c;默認情況下代碼會被燒寫到 Flash 中運行。然而&#xff0c;Flash 寫入速度較慢&#xff0c;擦寫次數有限&#xff0c;且調試過程中頻繁燒寫可能影響開發效率。在某些場景下&#xff08;如快…

【51單片機】【protues仿真】基于51單片機寵物投食系統

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 一、主要功能 1、LCD1602液晶顯示時間、溫度、食物重量 2、按鍵手動投喂食物? 3、稱重模塊檢測當前食物重量 4、食物重量小于閾值會聲光警報并自動投喂 二、使用步驟 基于51單片機的寵物投食…

騰訊云負載均衡增加訪問策略后訪問失敗

為了測試&#xff0c;在負載均衡的安全組添加2條安全策略&#xff0c;限制辦公室內IP可訪問&#xff0c;其他IP地址拒絕所有訪問。結果&#xff0c;訪問失敗。經過反復測試&#xff0c;主要是js問價加載失敗&#xff0c;動態接口訪問代碼返回正常。再進行測試&#xff0c;發現去…

CSS的文本樣式

1.文本樣式的分類注意&#xff1a;必須先建立標簽&#xff0c;再在head中修改1.1字體樣式1.1.1字體顏色代碼演示<head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…