目錄題目
棧:思路: 結論
**
在力扣上有一道演算法題叫做接雨水。如下圖(來自於力扣),要計算出在柱子的縫隙中能存多少水。
輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
計算列表list=[5,3,1,5]能接多少雨水。
1.建立乙個stack=
2.從左向右遍歷列表list,將list元素的index,0插入stack中,如果list[1]<=stack[-1]的元素,則繼續將1插入stack。繼續遍歷插入,直到得到list[i]>=stack[-1],然後執行stack.pop()。此時開始計算在list中,下標為stack[-1]與下標為i之間的雨水數。值得注意的是此時的stack[-1]是執行完stack.pop()之後的。舉個例子s=[1,2,3],s[-1]=3,如果執行完一次s.pop()後,s[-1]=2。可以先了解一下pop的用法。
3.然後繼續比較list[stack[-1]]與list[i]的的高度,如果list[stack[-1]]>list[i],則stack.pop(),並計算此時stack[-1]與i之間的雨水高度。
(對於list=[5,3,1,5]這個列表第2步計算得到圖中標號為1的雨水面積,第3步計算得到圖中面積為2的雨水面積,然後彙總得到結果)
4.直到遍歷結束
解法中的關鍵在於stack的彈出,不斷迴圈比較list[i]與棧中最後乙個元素的大小,如果棧中最後乙個元素小於list[i],則說明在list[i]和stack[-2]之間有可能存水,因為stack[-2]>=stack[-1]
class solution:
def trap(self, height) -> int:
s=0if len(height)<3: return s
stack=
for i in range(len(height)):
while len(stack)> 0 and height[i] > height[stack[-1]]:
p=stack.pop()
if len(stack)==0:
break
s+=(min(height[stack[-1]],height[i])-height[p])*(i-stack[-1]-1)
return s
單調棧 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 接雨水(棧解)
題目描述 定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 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 ...
leetcode42 接雨水 棧實現
public static int trap int height stackstack new stack 對陣列中每乙個元素遍歷 for int i 0 i height.length 1 i 取出的last和左右兩面牆的最低求差 x math.min height stack.peek hei...