---
title: "#42 Trapping Rain Water"
tags: LeetCode, Top100
---
#42 Trapping Rain Water
==
題目描述
--
Given ==n== non-negative integers representing an elevation map where the width of each bar is ==1==, compute how much water it can trap after raining.
Example 1:
--
>Input: height = [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
解題思維
--
利用暴力法,找出當前單位高度所能聚集的水量。
Brute force
--
```python=
class Solution:
def trap(self, height: List[int]) -> int:
res = 0
for i in range(1, len(height)-1):
leftWall = max(height[:i])
rightWall = max(height[i+1:])
if min(leftWall, rightWall) > height[i]:
res += min(leftWall, rightWall)-height[i]
return res
```
解題思維
--
暴力法雖然方便簡單去思考,但速度執行速度太慢了。
這裡借鏡DP演算法的思維,分別從左跟從右去建立當前的最佳解,再逐一去比較哪個才是真正的雨量累積。
Dynamic Programming
--
```python=
class Solution:
def trap(self, height: List[int]) -> int:
res = 0
length = len(height)
if length == 0:
return 0
leftWall = [0 for i in range(length)]
rightWall = [0 for i in range(length)]
leftWall[0] = height[0]
for i in range(1, length):
leftWall[i] = max(height[i], leftWall[i-1])
rightWall[length-1] = height[length-1]
for i in range(length-2, -1, -1):
rightWall[i] = max(height[i], rightWall[i+1])
for i in range(0, length):
res += min(leftWall[i], rightWall[i])-height[i]
return res
```
解題思維
--
利用兩個指針去夾出雨量聚集的結果
Two pointers
--
```python=
class Solution:
def trap(self, height: List[int]) -> int:
res = 0
left, right = 0, len(height)-1
if len(height) == 0:
return 0
rightMax, leftMax = 0, 0
while (right != left):
if(height[right] > height[left]):
if height[left] >= leftMax:
leftMax = height[left]
else:
res += leftMax - height[left]
left += 1
elif (height[right] <= height[left]):
if height[right] >= rightMax:
rightMax = height[right]
else:
res += rightMax - height[right]
right -= 1
return res
```