leetcode 42 接雨水 單調棧

2021-10-09 13:08:56 字數 1272 閱讀 9655

接雨水

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

上面是由陣列 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。 感謝 marcos 貢獻此圖。

示例:輸入: [0,1,0,2,1,0,1,3,2,1,2,1]

輸出: 6

題解:暴力的話就是m*n複雜度 可能會超時 考慮一下其他方案

要求的就是藍色區域,也就是凹進去的部分。那麼如何求解凹進去的部分,就是要對每一塊凹進去的部分得到左右兩邊的邊界資訊,通過邊界得到有多少塊小方塊可以填滿,那麼凹進去的形狀是很多樣的,如何正確求解?我們可以對每乙個高度維護乙個「凹」資訊,也就是把凹的前半部分放到乙個資料結構裡,那麼當我們走到凹的後半部分時候,就可以結合前半部分的資料進行計算,也就是對每乙個位置的高度,如果前面有坑,也就是可以積水,那麼我們就要拿到前面的積水左邊界的高度和位置資訊,由此可知,我們要用乙個棧去維護,當我遇到乙個高一點的位置,就要拿出之前放進去最近的左邊界的資訊用來計算。

棧裡要用的就像是括號匹配一樣的,只需要記錄左括號,也就是凹的左邊界資訊,那麼維護乙個下降高度的單調棧,棧內的元素表示由近到遠的遞增位置資訊。於是我們遍歷每乙個位置,對當前位置,

如果比棧頂元素小,那麼入棧進來形成乙個遞減的高度,也就是凹左邊界資訊

如何和棧頂元素相同,那麼也就形成乙個平台,我們只需要保留最近的乙個位置就好了,用新位置代替原棧頂元素;

如果比棧頂元素大,表示可能形成乙個凹區域,就要仔細判斷了:我們要把所有可能和當前位置形成積水的所有之前的位置都處理掉才能計算出正確答案,那就一直彈出棧頂元素,直到棧空或者遇到乙個比當前元素更大的位置。那麼也就是棧中的元素就是維護乙個每乙個小凹區域的積水的資訊,對每乙個棧頂元素,我們要計算這之間的積水資訊。也就需要這兩個位置之間的高度差還有與地面形成的高度差才能正確計算,前者好算後者就通過我們每次記錄乙個pre,通過這個pre來計算凹區域中最凹中間的高度,由此就可以計算出正確答案。

class

solution

else}if

(s.size()

&&height[i]

top()]

) s.

push

(i);}}

else

}return ans;}}

;

LeetCode 42 接雨水 困難

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,2,1,0,1...

(LeetCode 42)接雨水 思維題

42.接雨水 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,...

LeetCode 42 接雨水 Java實現

給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos貢獻此圖。示例 輸入 0,1,0,2,1,0,1,...