一魚多吃 用水槽模型 解 最多的雨水儲存量 Trapping Rain Water Leetcode #42

更新於 2024/09/27閱讀時間約 5 分鐘
raw-image

這題的題目在這裡:

題目敘述

題目會給我們一個陣列,陣列裡面每個數字分別代表高低各不同的隔板高度,問我們從降雨之後,最多可以儲存多少水量?


測試範例

Example 1:

範例一的圖解

範例一的圖解

Input: height = [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
Explanation: The above elevation map (black section) is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped.
藍色部分的方格,代表可以儲存雨水的格子點。​

Example 2:

Input: height = [4,2,0,3,2,5]
Output: 9

約束條件

Constraints:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

演算法

其實這一題和前面學過的水槽模型裝水那一題九成像。

都是給我們隔板高度,要求我們計算最多可以儲存的水量是多少?

差別在於:

前一題的水槽底部是平的

這一題的水槽底部高低不同,有凹有凸。

但是,最關鍵的核心精神相同,可以裝的水量多寡由比較矮的隔板決定

(因為水只要超過比較矮的那一邊就會溢出去,就算再下雨注入水也
無法儲存更多了。)


因此,我們只要建立一個滑窗,每次在水平方向移動一格收縮比較矮的一邊

如果左邊的隔板比右邊矮,就收縮左邊。

如果右邊的隔板比左邊矮,就收縮右邊。

每次迭代的時候,同步更新累加
當下可以儲存的水量 = 比較矮的隔板高度 - 水槽底部高度
(相當於二維平面上投影的面積,就像範例圖中的樣子)

最後,回傳能儲存雨水的總面積,就是答案。


程式碼

class Solution:
 def trap(self, height: List[int]) -> int:
  
  if len(height) < 3:
   
   # Quick response for impossible cases
   return 0
  
  volume, size = 0, len(height)
  
  # two pointers, initialized as boundary index
  left, right = 0, size-1
  
  # local max height on two sides
  left_wall_max, right_wall_max = height[left], height[right]
  
  # scan each index with two-pointers
  while left < right:
   
   # update local max height
   left_wall_max, right_wall_max = max(height[left], left_wall_max), max(height[right], right_wall_max)
   
   
   if left_wall_max <= right_wall_max:
    
    # left wall is shorter than right wall
    
    # update trapping rain water of current index
    volume += left_wall_max - height[left]
    
    # move left pointer to right hand side
    left += 1
    
   else:
    
    # right wall is shorter than left wall
    
    # update trapping rain water of current index
    volume += right_wall_max - height[right]
    
    # move right pointer to left hand side
    right -= 1
    
  
  return volume

複雜度分析

時間複雜度:

O( n ) 收縮滑窗,滑窗寬度從n-1 收縮到 1,總共耗費O(n)的時間

空間複雜度:

O(1) 都是臨時變數,所占用的記憶體空間固定,都是常數級別O(1)


關鍵知識點

這一題用到的也是水槽裝水的模型,唯一的小差別就是多了水槽底部有了高度,但是核心精神不變: 可以裝的水量多寡由比較矮的隔板決定

強烈建議複習Container With Most Water這一題,
鞏固 水槽裝水的模型雙指針應用的知識點


Reference:

[1] Python O(n) by two-pointers // DP [w/ Hint] - Trapping Rain Water - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
雖然表面是一道移除元素的題目,但實際上考的還是搬移。 題目要求的是把val目標值移除,等價於 把非目標值的搬到前面,並且回傳這些剩下來的元素個數(也就是 陣列裡面,非目標值的元素總數​)。 請看下方範例,會更好理解。
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
題目會給定一個2D 二維的矩陣,矩陣內的元素值代表對應的高度,要求我們找出相對最高點,也就是(大樓)高度大於N4 東、南、西、北 四個鄰居的索引值。 題目保證矩陣內相鄰的元素值都不相同,也又是相鄰的兩兩相比較,一定有一個比較高,有一個比較矮。
題目會給定一個陣列,陣列裡面的元素分布就像一座山峰。 最大值的左邊都是上坡段,最大值的右邊都是下坡段。 要求我們找出陣列裡面的絕對極大值(absolute max value)所在的陣列索引
題目會給定一個陣列,裡面有大有小,可以把數字的大小類比成高度 要求我們找出陣列裡面的相對極大值(relative max value)所在的陣列索引 也就是說當下這個元素,大於左邊鄰居的元素值,也大於右邊鄰居的元素值
雖然表面是一道移除元素的題目,但實際上考的還是搬移。 題目要求的是把val目標值移除,等價於 把非目標值的搬到前面,並且回傳這些剩下來的元素個數(也就是 陣列裡面,非目標值的元素總數​)。 請看下方範例,會更好理解。
題目會給定我們一個陣列,要求我們重新安排順序,把等於零的數字搬到後面。 同時必須保持原本數字的前後相對次序。
題目會給定一個陣列,要求我們把裡面的數字依照奇偶數去排序, 偶數的排在前面,奇數的排在後面。
題目會給定一個2D 二維的矩陣,矩陣內的元素值代表對應的高度,要求我們找出相對最高點,也就是(大樓)高度大於N4 東、南、西、北 四個鄰居的索引值。 題目保證矩陣內相鄰的元素值都不相同,也又是相鄰的兩兩相比較,一定有一個比較高,有一個比較矮。
題目會給定一個陣列,陣列裡面的元素分布就像一座山峰。 最大值的左邊都是上坡段,最大值的右邊都是下坡段。 要求我們找出陣列裡面的絕對極大值(absolute max value)所在的陣列索引
題目會給定一個陣列,裡面有大有小,可以把數字的大小類比成高度 要求我們找出陣列裡面的相對極大值(relative max value)所在的陣列索引 也就是說當下這個元素,大於左邊鄰居的元素值,也大於右邊鄰居的元素值
你可能也想看
Google News 追蹤
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
今天清晨的池上,好夢幻。五點時雲霧還沒有全罩,就看見遠方有部份的雲霧。但是隨著時間的流逝,雲霧範圍越來越大…到後來池上就整個被雲霧包圍了。美啊! 晨運時還看到田螺在做愛的進行式,很驚奇。 上午到大坡池聽樹木循環經濟課程,下午自己動手做蜜漬小番茄跟芒果青。自己動手做,滿滿的幸福感。
Thumbnail
自從遮雨棚做好,就開始逐一解決各種問題。 雖然上面有遮蓋,但邊邊角角落下來的地方, 還是會是因為水的流動讓廣場中間和四周圍帶點濕濕的感覺, 而讓乾燥度不夠。 逐漸地在每一次下雨就開始觀察,到底水積在哪裡?它是怎麼流動的? 流到哪裡去? 到那裏去之後會不會又積成一灘? 如果積在那裡,
Thumbnail
[微心世界]解答大家最常遇到的問題: 1、4、5、12、16、24、26、27、32、37、43、55、62、64、68、72、73、75。 [請勿複製貼到其他網站或任何其他用途,違者進行法律追究] 1. (4) 下列何者屬地下水超抽情形? ①天然補注量「超越」地下水抽水量 ②地下水抽水量「低於」降
Thumbnail
今天有個朋友來池上玩,我化身為一日人文美食導覽員,帶著他認識池上。
沒有傘的 日子 就這麼赤裸地 過去了,穿過 那些 多風的孔洞 這裡的 屋簷 都太短了 這裡的 一切都太濕了 你說 什麼,或者不說 都沒關係 話語只是 一袋袋投入沼澤的乾燥劑。 去聽,就是像魚群 那樣 去啄食它們 那麼 無用且安慰 就像穿透霧的光 和穿透水的
Thumbnail
1月13日早上,沖繩南城市大里嶺井的青空幼兒園游泳池裡的雨水結冰,厚度約0.5公分最大面積1.5公尺四方形,池中有大小冰塊還有霜,雨水大約積了有一公分。
Thumbnail
《雨天的祕密下水道》揭開了地底下排水溝的神祕面紗,充滿教育意義,適合親子共讀。
Thumbnail
我們高中到底都在幹嘛 我們除了在高二的實習場地,除了上課與考試外,那個時候在造園實習場地,旁邊就有農業用水溝,各位聽眾農業水溝可是超大的,而且也非常乾淨,裏面還有蝦就代表著水質十分清澈,在現在來看確實很稀有, 那時候我們男生六見客,加上四五個女生,,名義上是去練習考題上面的實作,實際上是在那邊玩
Thumbnail
徵的就是你 🫵 超ㄅㄧㄤˋ 獎品搭配超瞎趴的四大主題,等你踹共啦!還有機會獲得經典的「偉士牌樂高」喔!馬上來參加本次的活動吧!
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
今天清晨的池上,好夢幻。五點時雲霧還沒有全罩,就看見遠方有部份的雲霧。但是隨著時間的流逝,雲霧範圍越來越大…到後來池上就整個被雲霧包圍了。美啊! 晨運時還看到田螺在做愛的進行式,很驚奇。 上午到大坡池聽樹木循環經濟課程,下午自己動手做蜜漬小番茄跟芒果青。自己動手做,滿滿的幸福感。
Thumbnail
自從遮雨棚做好,就開始逐一解決各種問題。 雖然上面有遮蓋,但邊邊角角落下來的地方, 還是會是因為水的流動讓廣場中間和四周圍帶點濕濕的感覺, 而讓乾燥度不夠。 逐漸地在每一次下雨就開始觀察,到底水積在哪裡?它是怎麼流動的? 流到哪裡去? 到那裏去之後會不會又積成一灘? 如果積在那裡,
Thumbnail
[微心世界]解答大家最常遇到的問題: 1、4、5、12、16、24、26、27、32、37、43、55、62、64、68、72、73、75。 [請勿複製貼到其他網站或任何其他用途,違者進行法律追究] 1. (4) 下列何者屬地下水超抽情形? ①天然補注量「超越」地下水抽水量 ②地下水抽水量「低於」降
Thumbnail
今天有個朋友來池上玩,我化身為一日人文美食導覽員,帶著他認識池上。
沒有傘的 日子 就這麼赤裸地 過去了,穿過 那些 多風的孔洞 這裡的 屋簷 都太短了 這裡的 一切都太濕了 你說 什麼,或者不說 都沒關係 話語只是 一袋袋投入沼澤的乾燥劑。 去聽,就是像魚群 那樣 去啄食它們 那麼 無用且安慰 就像穿透霧的光 和穿透水的
Thumbnail
1月13日早上,沖繩南城市大里嶺井的青空幼兒園游泳池裡的雨水結冰,厚度約0.5公分最大面積1.5公尺四方形,池中有大小冰塊還有霜,雨水大約積了有一公分。
Thumbnail
《雨天的祕密下水道》揭開了地底下排水溝的神祕面紗,充滿教育意義,適合親子共讀。
Thumbnail
我們高中到底都在幹嘛 我們除了在高二的實習場地,除了上課與考試外,那個時候在造園實習場地,旁邊就有農業用水溝,各位聽眾農業水溝可是超大的,而且也非常乾淨,裏面還有蝦就代表著水質十分清澈,在現在來看確實很稀有, 那時候我們男生六見客,加上四五個女生,,名義上是去練習考題上面的實作,實際上是在那邊玩