*42. Trapping Rain Water 接雨水
阿新 • • 發佈:2019-04-29
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 接雨水