描述
給出 n 個非負整數,代表一張X軸上每個區域寬度爲 1 的海拔圖, 計算這個海拔圖最多能接住多少(面積)雨水。
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
樣例
-
樣例 1:
輸入: [0,1,0]
輸出: 0 -
樣例 2:
輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
挑戰
- O(n) 時間, O(1) 空間
- O(n) 時間, O(n) 空間也可以接受
思路
- 計算柱子I能承接多少水,其實就是尋找左邊最大的極值LeftMax[I],右邊最大的極值RightMax[I];
- 在水不漏掉的情況下,即左右兩邊的最大極值大於height[I]
- 得到每根柱子能承接的水量 min(LeftMax[I], RightMax[I]) - height[I]
代碼
在實際操作中,將一次尋找左邊最大值的遍歷 和 最後的計算合併
class Solution:
"""
@param heights: a list of integers
@return: a integer
"""
def trapRainWater(self, heights):
length = len(heights)
if length < 2:
return 0
leftMax = []
rightMax = []
# for i in range(length):
# if i == 0:
# leftMax.append(0)
# elif i == 1:
# leftMax.append(heights[0])
# else:
# leftMax.append(max(leftMax[i - 1], heights[i - 1]))
for i in range(length - 1, -1, -1):
if i == length - 1:
rightMax.append(0)
elif i == length - 2:
rightMax.append(heights[length - 1])
else:
rightMax.append(max(heights[i + 1], rightMax[length - i - 2]))
# rightMax.reverse()
# print(rightMax)
rain = 0
for i in range(length):
if i == 0:
leftMax.append(0)
rain += 0
continue
elif i == 1:
leftMax.append(heights[0])
else:
leftMax.append(max(leftMax[i - 1], heights[i - 1]))
if leftMax[i] > heights[i] and rightMax[length-i-1] > heights[i]:
rain += min(leftMax[i], rightMax[length-i-1]) - heights[i]
# print(leftMax)
return rain
if __name__ == '__main__':
print(Solution().trapRainWater([1, 3, 4, 5, 2, 4, 7, 4, 3]))