Leetcode——42. 接雨水

還記得第一次見該題根本無從下手。其實,我們不妨把問題拆解,簡單化。不要怕自己寫的是暴力算法,有很多算法技巧其實就是在暴力算法的基礎上優化得來。

題目目的是求所有可接雨水數量,我們可以求出每一個位置可接雨水數量,最后加起來即可。

就是如下流程:

int trap(vector<int>& height) {int n = height.size();vector<int> water(n, -1);for(int i = 0; i < n; ++i){// 求height[i]能存多少水water[i] = getWater(height, i);}int ans = 0;for(int x : water){ans += x;}return ans;}

那么現在問題只有一個,如何求單個位置的可接雨水量,根據題目,不難想到,只需要找左右兩邊可以“望”到的最高值,選取二者最小值,減去該位置高度即可。

完整代碼:

class Solution {
public:int trap(vector<int>& height) {int n = height.size();vector<int> water(n, -1);for(int i = 0; i < n; ++i){// 求height[i]能存多少水water[i] = getWater(height, i);}int ans = 0;for(int x : water){ans += x;}return ans;}int getWater(vector<int>& height, int k){int n = height.size();// 計算左高點int lmax = height[k];for(int i = k - 1; i >= 0; --i){if(height[i] > lmax){lmax = height[i];}}// 計算右高點int rmax = height[k];for(int i = k + 1; i < n; ++i){if(height[i] > rmax){rmax = height[i];}}// 返回結果return min(lmax, rmax) - height[k];}
};

不過這肯定是超時的。

在此基礎上,分析算法中重復計算的部分,我們在每一個位置得到?lmax?和?rmax?時都從零開始計算,這樣很浪費算力。由于求 lmaxrmax 本質就是簡單的求單調最大值,所以我們可以一遍遍歷求出每個位置的 lmax 或?rmax ,因為我們只需要向對應方向“望”到的最大值即可。

class Solution {
public:int trap(vector<int>& height) {int n = height.size();vector<int> lmax(n, 0);vector<int> rmax(n, 0);lmax[0] = height[0];for(int i = 1; i < n; ++i){lmax[i] = max(lmax[i - 1], height[i]);}rmax[n - 1] = height[n - 1];for(int i = n - 2; i >= 0; --i){rmax[i] = max(rmax[i + 1], height[i]);}int ans = 0;for(int i = 0; i < n; i++){ans += min(lmax[i], rmax[i]) - height[i];}return ans;}
};

最后,考慮是否可以繼續優化時間和空間。

我們假設只有兩個變量,分別記錄 1 位置的 lmaxn - 2 位置的 rmax ,考慮現在誰的雨水量是可求的。

思考分析后得出,當兩個變量進行比較,較小的一方所指位置的雨水量是可求的。

lmax 指向 1 位置,值為100rmax 指向 n - 2 為位置,值為70為例,即使當前 lmax 對于? ? ??n - 2位置來說并不是真正的 lmax ,但其真正值只會比100大,而接雨水量是由小的一方決定的。

class Solution {
public:int trap(vector<int>& height) {int lidx = 1;int lmax = height[0];int ridx = height.size() - 2;int rmax = height[ridx + 1];int ans = 0;while(lidx <= ridx){if(lmax > rmax){ans += max(0, rmax - height[ridx]);rmax = max(rmax, height[ridx--]);}else{ans += max(0, lmax - height[lidx]);lmax = max(lmax, height[lidx++]);}}return ans;}
};

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

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

相關文章

Go 語言-->指針

Go 語言–>指針 它允許你操作內存中的實際數據&#xff0c;而不僅僅是數據的副本。指針存儲的是另一個變量的內存地址&#xff0c;而不是變量的實際值。 1. 什么是指針 指針是存儲變量內存地址的變量&#xff0c;它指向另一個變量。通過指針&#xff0c;你可以間接地訪問和修…

軟工八將:軟件開發全流程核心角色體系解析

軟工八將&#xff1a;軟件開發全流程核心角色體系解析 作者注&#xff1a;本概念是由大學生董翔提出&#xff0c;具有一些影響意義。 在現代軟件開發領域&#xff0c;團隊角色的專業化分工是產品成功的核心保障。“軟工八將”作為一套系統梳理軟件開發全流程核心角色的術語&…

安全風險監測系統是什么?內容有哪些?

安全風險監測系統是基于物聯網感知網絡與智能分析技術的綜合管理平臺&#xff0c;通過實時采集、分析和評估各類安全風險指標&#xff0c;構建起覆蓋識別、預警、處置全流程的主動防御體系。作為現代安全管理的中樞神經系統&#xff0c;該系統實現了從被動響應到主動預防的范式…

車載診斷架構 ---面向售后的DTC應該怎么樣填寫?

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 簡單,單純,喜歡獨處,獨來獨往,不易合同頻過著接地氣的生活,除了生存溫飽問題之外,沒有什么過多的欲望,表面看起來很高冷,內心熱情,如果你身…

墨者:SQL注入漏洞測試(寬字節)

墨者學院&#xff1a;SQL注入漏洞測試(寬字節)&#x1f680; 1. 寬字節注入原理? 1.1. 與普通注入對比? 特性普通注入寬字節注入適用場景無轉義處理使用addslashes()等轉義函數核心原理直接閉合引號利用GBK等編碼吞掉轉義符\關鍵字符 " -- #%df %5c防御難度易防御需調…

(二)Eshop(RabbitMQ手動)

文章目錄項目地址一、Rabbit MQ1.1 Pulibsher1. IRabbitMQPublisher接口2. RabbitMQPublisher接口實現3. 使用1.2 Consumer1. 消費接口2. 實現消費者接口項目地址 教程作者&#xff1a;教程地址&#xff1a; 代碼倉庫地址&#xff1a; 所用到的框架和插件&#xff1a; dbt a…

WPF高級學習(一)

文章目錄一、理解進程和線程1. 進程&#xff1a;就像一個獨立的“工廠”舉例&#xff1a;2. 線程&#xff1a;就像工廠里的“工人”舉例&#xff1a;總結&#xff1a;進程 vs 線程二、線程一、WPF 中的線程類型二、核心規則&#xff1a;線程親和性&#xff08;Thread Affinity&…

JAVA知識點(四):SpringBoot與分布式、微服務架構

文章目錄SpringBoot 使用 Validation 進行參數校驗并統一返回校驗異常引入相應的依賴Validation的基本校驗注解添加參數校驗在DTO的屬性上添加校驗在controller對應的DTO添加Valid或者Validated對于復雜String校驗我們可以使用正則來校驗&#xff0c;如下所示&#xff1a;自定義…

GPU 服務器ecc報錯處理

1. 常見原因分析內存硬件問題&#xff1a;DIMM 內存模塊損壞或接觸不良&#xff08;最常見原因&#xff09;。內存插槽氧化、松動或物理損壞。內存與主板兼容性問題&#xff08;尤其是非原廠內存&#xff09;。環境因素&#xff1a;服務器內部溫度過高&#xff0c;導致內存穩定…

STM32入門之通用定時器PWM

一、通用定時器簡介STM32通用定時器由一個通過可編程預分頻器驅動的16位自動重裝載計數器組成&#xff0c;適用于多種應用場景&#xff0c;包括測量輸入信號的脈沖長度&#xff08;利用輸入捕獲功能&#xff09;和生成輸出波形&#xff08;使用輸出比較及PWM功能&#xff09;。…

第十八節 MATLAB for循環

MATLAB中 for 循環是一個重復的控制結構&#xff0c;可以有效地寫一個循環&#xff0c;只是執行的次數是特定的。MATLAB for 循環語法:MATLAB中的 for循環的語法如下&#xff1a;for index values<program statements>... endfor 循環的值有下述三種形式之一&#xff1a…

嵌入式硬件篇---zigbee無線串口通信問題解決方法

針對 ZigBee 無線串口通信中接收異常的問題&#xff0c;需結合其射頻特性、網絡機制、硬件配置等多維度原因&#xff0c;采取針對性解決措施。以下從具體場景出發&#xff0c;提供可落地的解決方法&#xff1a;一、解決射頻層干擾與信號衰減問題射頻層是無線通信的基礎&#xf…

移動高清盒子6PRO-河南創維E900V22D-晶晨S905L3B-4+16G-安卓9-線刷固件包

移動高清盒子6PRO-河南創維E900V22D-晶晨S905L3B-416G-安卓9-線刷固件包線刷方法&#xff1a;1、準備好一根雙公頭USB線刷刷機線&#xff0c;長度30-50CM長度最佳&#xff0c;同時準備一臺電腦&#xff1b;2、電腦上安裝好刷機工具Amlogic USB Burning Tool 軟件 →打開軟件 →…

臺式電腦有多個風扇開機只有部分轉動的原因

一、風扇未連接或連接松動這是最常見的原因之一&#xff0c;臺式機風扇通常需要通過線材與主板或電源連接&#xff1a;主板接口問題&#xff1a;CPU 風扇、機箱風扇等多連接到主板的風扇接口&#xff08;如 CPU_FAN、SYS_FAN&#xff09;&#xff0c;若線材未插緊、插錯接口&am…

【測試報告】思緒網(Java+Selenium+Jmeter自動化測試)

一、項目簡介思緒網作為一種在線交流平臺&#xff0c;支持用戶在平臺下發布文章&#xff0c;并進行討論。主要由登錄頁面&#xff0c;論壇頁面&#xff0c;帖子編輯頁&#xff0c;帖子詳情頁等頁面組成。二、項目功能1.登錄頁面&#xff1a;輸入正確的賬號密碼進行登錄,跳轉博客…

Nestjs框架: 基于Mongodb的多租戶功能集成和優化

概述 基于前文&#xff0c;我們知道如何集成多租戶的相關功能了, 現在我們繼續集成Monodb的多租戶形式需要注意的是&#xff0c;MongoDB 在 NestJS 中的使用過程中存在一些“坑點”如果按照默認方式集成&#xff0c;會發現連接數在不斷增長&#xff0c;即使我們請求的是相同的數…

如何利用機器學習分析篩選生物標記物

在生物信息學中&#xff0c;Lasso回歸、隨機森林&#xff08;Random Forest&#xff09;和XGBoost因其各自的特性和優勢&#xff0c;被廣泛應用于基因組學、蛋白質組學、藥物發現和疾病機制研究等領域。 Lasso回歸 癌癥亞型分類&#xff1a;從TCGA數據中篩選驅動基因&#xf…

計算機網絡(基礎篇)

TCP/IP 網絡模型 應用層&#xff08;Application Layer&#xff09; 應用層只需要專注于為用戶提供應用功能&#xff0c;比如 HTTP、FTP、Telnet、DNS、SMTP等。應用層是工作在操作系統中的用戶態&#xff0c;傳輸層及以下則工作在內核態。傳輸層&#xff08;Transport Layer&a…

全面解析 CSS Flex 布局:從入門到精通的所有屬性詳解

1. Flex 容器屬性 通過 display: flex 或 display: inline-flex 將元素設置為 Flex 容器。以下是所有容器屬性。 1.1 display: flex | inline-flex 作用&#xff1a;定義一個 Flex 容器。可選值&#xff1a; flex&#xff1a;塊級容器&#xff0c;占據整行。inline-flex&#x…

數據結構:對角矩陣(Diagonal Matrix)

目錄 矩陣的傳統表示&#xff1a;二維數組 &#x1f50d; 真正有用的數據是哪些&#xff1f; 從二維數組轉為一維數組 用 C 類實現對角矩陣 1. 對角矩陣真正需要存什么&#xff1f; 2. 對角矩陣允許哪些行為&#xff1f; 3. 為什么要動態分配數組&#xff1f; 接下來推…