python 棧的應用 接雨水

2021-10-06 14:20:47 字數 1352 閱讀 3692

目錄題目

棧:思路: 結論

**

在力扣上有一道演算法題叫做接雨水。如下圖(來自於力扣),要計算出在柱子的縫隙中能存多少水。

輸入: [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...