1. 程式人生 > >*42. Trapping Rain Water 接雨水

*42. Trapping Rain Water 接雨水

rain 情況下 temp n-1 寬度 最小 mar 當前位置 sel

1. 原始題目

給定 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

2. 思路

最簡單的想法:對於每個元素都要考慮它能接多少雨水:

第一個元素是0,能接0雨水

第二個元素是1,能接0雨水

第三個元素是0,能接1雨水

...

第六個元素是0,能接2雨水。

可以看到,每個元素能接的雨水量是:當前位置左邊最高的數與右邊最高的數的最小值減去當前位置的數。

例如第六個元素接水量為2 = min(2,3)-0=2。

按照這個思路可以寫一個最簡單的代碼:

3. 解題

 1 class Solution:
 2     def trap(self, height):
 3         if not height: return 0
 4         n = len(height)
 5         left,right = [0]*n, [0]*n     # 每個位置都存放其左邊最大值和右邊最大值
 6         temp = 0
 7         for i in range(n):     
 8             temp= max(temp,height[i]) # 找每個元素的左邊最大值(含自身) 
9 left[i] = temp 10 temp = 0 11 for i in range(n-1,-1,-1): 12 temp = max(temp,height[i]) # 找每個元素的右邊最大值(含自身) 13 right[i] = temp 14 res = 0 15 for i in range(n): 16 res+=min(left[i],right[i])-height[i] # 最小的高度值-自身
17 return res

*42. Trapping Rain Water 接雨水