leetcode熱題HOT42. 接雨水

一、問題描述:

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

二、解題思路:

思路1:通過動態規劃的預處理方式,分別計算每個柱子左右兩側的最大高度,然后通過遍歷計算每個柱子的位置能夠存儲的水量,最終求得總的積水量。

  • 代碼示例:
public int trap(int[] height) {int length = height.length;if (length <= 2) return 0;int[] maxLeft = new int[length];int[] maxRight = new int[length];// 記錄每個柱子左邊柱子最大高度maxLeft[0] = height[0];for (int i = 1; i< length; i++) maxLeft[i] = Math.max(height[i], maxLeft[i-1]);// 記錄每個柱子右邊柱子最大高度maxRight[length - 1] = height[length - 1];for(int i = length - 2; i >= 0; i--) maxRight[i] = Math.max(height[i], maxRight[i+1]);// 求和int sum = 0;for (int i = 0; i < length; i++) {int count = Math.min(maxLeft[i], maxRight[i]) - height[i];if (count > 0) sum += count;}return sum;}
  • 時間復雜度為 O(n),空間復雜度為 O(n),

思路2:用單調棧計算能接的雨水總量。

找到高-低-高形狀的凹槽。
通過維護一個單調棧,單調棧存儲的是下標,滿足從棧底到棧頂的下標對應的數組 height 中的元素遞減。
遍歷數組,只要當前遍歷的元素 height[i] 大于棧頂元素 height[top],且棧中至少包含兩個元素,就可以形成一個“凹槽”,height[i] 是右邊界,top下面的元素是左邊界 height[left] 。
凹槽的儲水量 curheight = Math.min(height[left], height[i]) - height[top];

  • 代碼示例:
public int trap(int[] height) {int result = 0;  // 存儲最終的接水量Deque<Integer> stack = new LinkedList<Integer>();  // 單調棧,存儲數組索引int n = height.length;  // 數組長度for(int i = 0; i < n; ++i) {// 當棧非空且當前柱子高度大于棧頂柱子高度時,可以接雨水while(!stack.isEmpty() && height[i] > height[stack.peek()]) {int top = stack.pop();  // 彈出棧頂元素,表示當前可以接水的高度if(stack.isEmpty()) break;int left = stack.peek();  // 左邊界,當前彈出元素的左邊界int curwidth = i - left - 1;  // 當前可以接水的寬度// 當前可以接水的高度,即左右邊界的最小高度減去當前彈出元素的高度int curheight = Math.min(height[left], height[i]) - height[top];// 累加當前可以接水的體積//System.out.println(i +" " + left + " " + top + " " + curwidth * curheight);result += curwidth * curheight;}stack.push(i);  // 將當前柱子索引壓入棧中}  return result;  // 返回最終的接水量}    
  • 時間復雜度為 O(n),空間復雜度也為 O(n)

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

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

相關文章

js數據庫多級分類按樹形結構打印

可以使用 JavaScript 來按層級打印 categories 數組。首先&#xff0c;需要將這個數組轉換成一個樹形結構&#xff0c;然后再進行遞歸或者迭代來打印每個層級的內容。 以下是一個示例代碼&#xff0c;用來實現這個功能&#xff1a; const categories [{ id: 2, name: "…

java如何刪除字符串內部分字符

java中&#xff0c;如果要刪除字符串內部分字符&#xff0c;需要用delete方法&#xff0c;前提字符串是可變字符串StringBuffer類型的。 delete方法的語法格式是sbf.delete(start,end) 其中&#xff0c;sbf是任意StringBuffer對象&#xff0c;start是起始索引&#xff0c;end…

AQ mode

算法原理概述 AQ即adaptive quantization(自適應量化),屬于宏塊級別碼流分配的范疇,在一幀的宏塊之間調整碼率分配,x264中AQ算法的核心內容是:復雜宏塊使用大的QP,簡單宏塊使用小的QP。x264如何定義復雜?x264是根據宏塊內像素值的方差來評價宏塊復雜性,方差越大,宏塊…

溶解氧(DO)理論指南(1)

轉載自梅特勒官網資料&#xff0c;僅用于學習交流&#xff0c;侵權則刪&#xff01; 溶解氧理論指南 1 溶解氧(DO)原理1.1 溶解氧和分壓1.2 氧氣在水中的溶解度1.3 溶解氧對生物的重要性1.4 溶解氧對工業的重要性 1 溶解氧(DO)原理 氧是宇宙中第三大常見元素&#xff0c;也是…

JavaScript(6)——數據類型轉換

為什么需要類型轉換&#xff1f; JavaScript是弱數據類型&#xff1a;JavaScript不知道變量到底屬于哪種數據類型&#xff0c;只有賦值了才清除 使用表單&#xff0c;prompt獲取的數據默認為字符串類型&#xff0c;此時不能直接進行算數運算 隱式轉換 某些運算符被執行時&am…

力扣hot100-鏈表

文章目錄 概要鏈表的類型 題目&#xff1a;相交鏈表題解 概要 鏈表&#xff08;Linked List&#xff09;是數據結構中的一種&#xff0c;用于存儲具有線性關系的數據。在鏈表中&#xff0c;每個元素稱為一個節點&#xff08;Node&#xff09;&#xff0c;每個節點包含兩個部分…

”極大似然估計“和”貝葉斯估計“思想對比

極大似然估計&#xff08;Maximum Likelihood Estimation, MLE&#xff09;和貝葉斯估計&#xff08;Bayesian Estimation&#xff09;是統計學中兩種重要的參數估計方法&#xff0c;它們在思想和應用上有著顯著的差異。下面我將詳細對比這兩種方法的思想&#xff0c;并分別舉出…

兩次叛國投敵,沒有禍及子孫反而家族長盛不衰的傳奇

這個人就是韓國國王韓王信&#xff0c;漢朝八大異姓王之一。 第一次叛國投敵&#xff0c;發生在楚漢爭霸時期。有一次他的軍隊被項羽包圍&#xff0c;于是選擇了投降。不過&#xff0c;這是權宜之計&#xff0c;不久就借機回到劉邦陣營。 第二次叛國投敵&#xff0c;發生在西…

【Linux開發】基于ALSA庫實現音量調節

基于ALSA庫實現音量調節 ALSA庫實現音量調節1、使用alsamixer工具查看音頻接口2、完整代碼2.1、snd_mixer_open2.2、snd_mixer_attach、2.3、snd_mixer_selem_register2.4、snd_mixer_load2.5、snd_mixer_first_elem/snd_mixer_elem_next2.6、snd_mixer_selem_get_playback_vol…

linux下php的psr.so擴展源碼安裝

cd /usr/local/src git clone https://github.com/jbboehr/php-psr.git cd php-psr /usr/local/php/bin/phpize ./configure --with-php-config/usr/local/php/bin/php-config make make install在php.ini中添加extensionpsr.so 重啟php-fpm /etc/init.d/php-fpm relo…

打卡第3天---鏈表相關

除了每天自己寫博客總結我個人的學習收獲情況之外,我也會看其他錄友寫的博客文章,對于其他錄友的博客內容在代碼隨想錄的訓練營都是開誠布公的,都能互相看到。彼此學習,彼此參照,有一位錄友思路很清晰呀,用畫圖軟件把自己對題的思路畫的特別清晰,我 應該向他們學習;除此…

從零開始使用 Docsify 搭建文檔站點

引言 在當今的技術環境中&#xff0c;擁有一份易于訪問和美觀的文檔是至關重要的。Docsify 是一個非常適合快速搭建文檔站點的工具&#xff0c;它簡單易用&#xff0c;且不需要生成靜態文件。本文將帶你一步步從零開始使用 Docsify 搭建一個文檔站點。 1. 安裝 Node.js 和 np…

【ARMv8/v9 GIC 系列 5.1 -- GIC GICD_CTRL Enable 1 of N Wakeup Function】

請閱讀【ARM GICv3/v4 實戰學習 】 文章目錄 GIC Enable 1 of N Wakeup Function基本原理工作機制配置方式應用場景小結GIC Enable 1 of N Wakeup Function 在ARM GICv3(Generic Interrupt Controller第三代)規范中,引入了一個名為"Enable 1 of N Wakeup"的功能。…

上海市計算機學會競賽平臺2023年2月月賽丙組區間的并

題目描述 給定一個數軸上的 &#x1d45b;n 個閉區間&#xff0c;第 &#x1d456;i 個閉區間的兩端點為[&#x1d44e;&#x1d456;,&#x1d44f;&#x1d456;][ai?,bi?]&#xff0c;它們的并集可以表示為若干不相交的閉區間&#xff0c;請按照左端點從小到大的順序輸出…

(一)Docker基本介紹

部署項目的發展 傳統部署適合需要最大性能和可靠性的場景&#xff0c;但在資源利用和管理方面有顯著劣勢。虛擬化部署提供了良好的資源利用率和隔離性&#xff0c;適用于需要靈活擴展和多租戶環境的場景&#xff0c;但存在性能開銷。容器部署在輕量級、可移植性和資源利用率方面…

適合金融行業的國產傳輸軟件應該是怎樣的?

對于金融行業來說&#xff0c;正常業務開展離不開文件傳輸場景&#xff0c;一般來說&#xff0c;金融行業常用的文件傳輸工具有IM通訊、郵件、自建文件傳輸系統、FTP應用、U盤等&#xff0c;這些傳輸工具可以基礎實現金融機構的文件傳輸需求&#xff0c;但也存在如下問題&#…

【Java10】成員變量與局部變量

Java中的變量只有兩種&#xff1a;成員變量和局部變量。 和C不同&#xff0c;沒有全局變量了。 成員變量&#xff0c;field&#xff0c;我習慣稱之為**”屬性“**&#xff08;但這些年&#xff0c;因為attribute更適合被叫做屬性&#xff0c;所以漸漸不這么叫了&#xff09;。 …

google 郵件信息收集

主要介紹通過google和fofax對目標進行郵件信息收集 chrome插件 email-whatsapp-extractor link-klipper-extract-all bulk-url-opener-extension email-whatsapp-extractor 使用正則表達式&#xff0c;獲取訪問頁面內所有的email郵箱和whatsapp號碼&#xff0c;以表格的形式導…

el-table封裝點擊列篩選行數據功能,支持篩選,搜索,排序功能

數據少的話&#xff0c;可以前端實現&#xff0c;如果多的話&#xff0c;建議還是請求接口比較合理父組件&#xff1a; <template> <div class"home"> <!-- <img alt"Vue logo" src"../assets/logo.png"> <HelloWorld …

Hilbert編碼 思路和scala 代碼

需求&#xff1a; 使用Hilbert 曲線對遙感影像瓦片數據進行編碼&#xff0c;獲取某個區域的編碼值即可 Hilbert 曲線編碼方式 思路 大致可以對四個方向的數據進行歸類 左下左上右上右下 這個也對應著編碼的順序 思考在不同Hilbert深度&#xff08;階&#xff09;情況下的…