【LeetCode熱題100道筆記+動畫】接雨水

題目描述

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之后能接多少雨水。
在這里插入圖片描述

示例 1
輸入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
輸出:6
解釋:上面是由數組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。

示例 2:
輸入:height = [4,2,0,3,2,5]
輸出:9

提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

思考一(動態規劃)

可能一開始琢磨著怎么統計連續的接水區域面積,想不到把柱子形成的洼地分解成一個個柱子寬度大小的單位水桶進行計算,如下圖:
在這里插入圖片描述
洼地分解成每個柱子寬度的水桶,只要確定這個水桶左右邊界(木板)的高度最小值就能計算這個柱子的接水量了。比如圖中的紅色區域柱子,它的左邊木板高度是 2,是左邊所有柱子高度的最大值,這個木板高度為什么取左邊最大值?顯然,左邊最高的木板能擋住更多的水,如果左邊最高的木板離當前柱子比較遠,那接水的面積可能更大。同理右邊木板最大高度是右邊所有柱子中高度最大的。現在確定了當前水桶(柱子)的左右木板高度,那么實際水桶的接水量就取決于兩個木板最短的那個減去當前柱子的高度,即 water[i]=Min(leftSide,rightSide)?height[i]water[i] = Min(leftSide, rightSide) - height[i]water[i]=Min(leftSide,rightSide)?height[i]。上圖中的紅色部分接水量 w=Math.min(2,3)?1=1w = Math.min(2, 3) - 1 = 1w=Math.min(2,3)?1=1。定義兩個數組 leftMaxrightMax 用于分別存儲每個柱子左右木板的最大值,初始化 leftMax = height[0], rightMax = height[height.length-1],分別正序遍歷和倒序遍歷數組更新leftMax[i]rightMax[i],每次遍歷的高度與數組存儲的之前最大高度比較取最大值,這是動態規劃思想。最后遍歷高度數組 height,根據預處理的當前柱子左右木板高度和當前柱子高度很容易計算當前柱子的接水量,累加所有柱子接水量就是整個題目的答案。

算法過程

  1. 初始化兩個數組 leftMaxrightMax,分別用于存儲每個位置左側和右側的最大高度
  2. 正序遍歷高度數組,計算 leftMax[i]:每個位置左側的最大高度(包含當前位置)
  3. 倒序遍歷高度數組,計算 rightMax[i]:每個位置右側的最大高度(包含當前位置)
  4. 遍歷每個位置,計算該位置可接水量:Math.min(leftMax[i], rightMax[i]) - height[i]
  5. 累加所有位置的接水量,得到總接水量并返回,時間復雜度O(n)O(n)O(n),空間復雜度O(n)O(n)O(n)

代碼

/*** @param {number[]} height* @return {number}*/
var trap = function(height) {const len = height.length;const leftMax = new Array(height

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

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

相關文章

短劇小程序系統開發:構建影視娛樂新生態的基石

在移動互聯網的浪潮中&#xff0c;影視娛樂行業正經歷著深刻的變革。短劇&#xff0c;作為一種新興的內容形式&#xff0c;以其獨特的魅力和廣泛的受眾基礎&#xff0c;成為了行業發展的新亮點。而短劇小程序系統開發&#xff0c;則是構建影視娛樂新生態的基石&#xff0c;為行…

基于Pytochvideo訓練自己的的視頻分類模型

視頻分類模型簡介 ?X3D 系列模型 官方網站 https://github.com/facebookresearch/SlowFast ?提出論文? Facebook Research 的《X3D: Expanding Architectures for Efficient Video Recognition》 https://arxiv.org/pdf/2004.04730 原理 X3D 的設計思路受到機器學習中…

LidaRefer-v2論文速讀

研究背景 研究背景 3D視覺定位&#xff08;3D Visual Grounding, VG&#xff09;是一項旨在根據自然語言描述&#xff0c;在三維場景中精確定位出相應物體或區域的任務 。這項技術在人機交互領域至關重要&#xff0c;尤其是在自動駕駛、機器人技術和AR/VR等應用中&#xff0c;它…

邏輯移位與算術移位

根本的區別在于&#xff1a;它們如何對待符號位&#xff08;最高位&#xff09;。 一、邏輯移位 (Logical Shift) 無論左移、右移&#xff0c;空出的位永遠用 0 填充。主要針對無符號整數、快速乘除2的冪。 二、算術移位 (Arithmetic Shift) 左移用 0 填充、右移用符號位填充。…

內存對齊的使用和禁用

在 C 語言和 C 中&#xff0c;__attribute__((packed)) 是一種用于數據結構體的編譯器擴展屬性&#xff0c;這個屬性主要用于修改結構體的內存對齊行為。背景知識&#xff1a;結構體內存對齊在許多計算機架構中&#xff0c;編譯器會自動對數據進行對齊&#xff08;alignment&am…

SpringBoot3后端項目介紹:mybig-event

mybig-event 項目簡介 mybig-event 是一個基于 Spring Boot 的事件管理系統&#xff0c;提供用戶管理、文章發布、分類管理、文件上傳等功能&#xff0c;采用現代化的 Java 技術棧構建&#xff0c;支持高效開發和部署。 倉庫鏈接&#xff1a;https://github.com/foorgange/mybi…

week3-[分支嵌套]方陣

week3-[分支嵌套]方陣 題目描述 有 nmn\times mnm 個人站成 nnn 行 mmm 列的方陣。我們想知道第 xxx 行 yyy 列的人的某個方向有沒有人。 輸入格式 輸入共 222 行。 第 111 行輸入 444 個正整數 n,m,x,yn,m,x,yn,m,x,y。 第 222 行輸入 111 個字符為 U、D、L、R 其中之一&#…

深入理解C++ std::shared_ptr:現代C++內存管理的藝術與實踐

在C++的發展歷程中,內存管理始終是開發者面臨的核心挑戰。從C語言繼承而來的手動內存管理方式,雖然提供了極大的靈活性,卻也成為無數程序錯誤的根源。內存泄漏、懸空指針、雙重釋放等問題長期困擾著C++開發者,直到智能指針的出現改變了這一局面。作為C++11標準引入的重要特…

一個 WPF 文檔和工具窗口布局容器

一個 WPF 文檔和工具窗口布局容器、用于排列文檔 和工具窗口的方式與許多知名 IDE 類似&#xff0c;例如 Eclipse、Visual Studio、 PhotoShop 等等 AvalonDock 是一個 WPF 文檔和工具窗口布局容器&#xff0c;用于排列文檔 和工具窗口的方式與許多知名 IDE 類似&#xff0c;例…

【qml-5】qml與c++交互(類型單例)

背景&#xff1a; 【qml-1】qml與c交互第一次嘗試&#xff08;實例注入&#xff09; 【qml-2】嘗試一個有模式的qml彈窗 【qml-3】qml與c交互第二次嘗試&#xff08;類型注冊&#xff09; 【qml-4】qml與c交互&#xff08;類型多例&#xff09; 【qml-5】qml與c交互&#…

循環神經網絡(RNN)、LSTM 與 GRU (一)

循環神經網絡&#xff08;RNN&#xff09;、LSTM 與 GRU &#xff08;一&#xff09; 文章目錄循環神經網絡&#xff08;RNN&#xff09;、LSTM 與 GRU &#xff08;一&#xff09;循環神經網絡&#xff08;RNN&#xff09;、LSTM 與 GRU一、RNN&#xff08;Recurrent Neural N…

【AAOS】Android Automotive 16模擬器源碼下載及編譯

源碼下載repo init -u https://android.googlesource.com/platform/manifest -b android-16.0.0_r2 repo sync -c --no-tags --no-clone-bundle源碼編譯source build/envsetup.sh lunch sdk_car_x86_64-bp2a-eng make -j8運行效果emualtorHomeAll appsSettingsHAVCNotification…

jvm三色標記

好的&#xff0c;咱們把專業概念和生活例子結合起來&#xff0c;一步一步說清楚三色標記法&#xff1a;一、核心概念&#xff1a;用“顏色”給對象貼“狀態標簽”就像給家里的物品貼標簽&#xff0c;每種顏色代表它在“垃圾回收&#xff08;大掃除&#xff09;”中的狀態&#…

生成式AI的能力邊界與職業重構:從“百科實習生“到人機協作增強器

根據微軟最新研究&#xff0c;基于20萬條Copilot使用數據及用戶反饋&#xff0c;研究者揭示了生成式AI在實際應用中的能力邊界與職業影響。數據顯示&#xff0c;用戶使用AI助手最頻繁的任務是信息獲取&#xff08;占比近40%&#xff09;&#xff0c;其次是公眾溝通類工作&#…

java17學習筆記

Java17是一個重要的特性發布&#xff0c;也是比較常用的一個版本&#xff0c;根據 2024Java生態統計&#xff0c;Java 17、11 和 8 的用戶比例分別為 35%、33% 和 29%。它遵循了自Java10以來引入的Java發布步調&#xff0c;并于2021年 9 月 14 日發布&#xff0c;在Java16發布后…

【AI應用】修改向量數據庫Milvus默認密碼

說明&#xff1a; 1&#xff09;部署向量數據庫milvus運行一段時間后&#xff0c;想開啟密碼認證登錄attu頁面 2&#xff09;開啟密碼認證登錄&#xff0c;提示用戶和密碼不正確&#xff0c;因為默認密碼已存儲在物理機 3&#xff09;通過attu管理頁面修改向量數據庫milvus默認…

分布式系統消息隊列:可靠投遞與延時消息實戰

在分布式系統架構中&#xff0c;消息隊列&#xff08;MQ&#xff09;作為解耦服務、削峰填谷、異步通信的核心組件&#xff0c;其消息投遞的可靠性與延時消息的精準性直接影響業務系統的穩定性。本文結合實際業務場景&#xff0c;詳細解析消息投遞的全流程設計與延時消息的通用…

Java 學習筆記(基礎篇6)

面向對象基礎1. 類和對象(1) 示例&#xff1a;public class Student {String name "張三";int age 23;public void study() {System.out.println("學習 Java");}public void eat() {System.out.println("吃飯");} }public class Test {public …

光學件加工廠倚光科技:陪跑光學未來力量

在光學創新的漫漫長路上&#xff0c;總有一些看似 “不劃算” 的堅持&#xff0c;卻在悄然改寫行業的未來。倚光科技的故事&#xff0c;就始于這樣一種選擇 —— 明知光學打樣利潤微薄&#xff0c;明知上百個項目中能走到量產的寥寥無幾&#xff0c;仍愿意投入全球頂尖的設備與…

RabbitMQ:生產者可靠性(生產者重連、生產者確認)

目錄一、生產者重連二、生產者確認一、生產者重連 當網絡不穩定的時候&#xff0c;利用重試機制可以有效提高消息發送的成功率。不過SpringAMQP提供的重試機制是阻塞式的重試&#xff0c;也就是說多次重試過程中&#xff0c;當前線程是被阻塞的&#xff0c;會影響業務性能。 …