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.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
Example:
Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
Solution1:(TLE)
class Solution:
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
res = 0
for i in range(1,len(height)-1):
maxleft,maxright = 0,0
for j in range(i,-1,-1):
maxleft = max(maxleft,height[j])
for j in range(i,len(height)):
maxright = max(maxright,height[j])
res += min(maxright,maxleft) - height[i]
# print('i',i,'maxleft',maxleft,'maxright',maxright,'ans',min(maxright,maxleft) - height[j])
return res
每个位置的组左右高度,不是其相邻位置的高度,而是整个左边部分和右边部分的最大值
Solution2:
class Solution:
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
if len(height)==0:
return 0
res = 0
leftmax = [0 for i in range(len(height))]
rightmax = [0 for i in range(len(height))]
leftmax[0] = height[0]
for i in range(1,len(height)):
leftmax[i] = max(height[i],leftmax[i-1])
rightmax[-1] = height[-1]
for i in range(len(height)-2,-1,-1):
rightmax[i] = max(height[i],rightmax[i+1])
for i in range(1,len(height)-1):
res += min(leftmax[i],rightmax[i])-height[i]
return res
先用动态规划求出每个点的情况,然后再算。