给定 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
思路:一开始想到了从下往上一层层的做,代码能算出来,不过运行超时了0.0
class Solution:
def trap(self, height):
res = 0
if len(height) == 0:
return 0
maxH = max(height)
for i in range(maxH):
sum,height = self.func(height,i)
res += sum
return res
def func(self,height,h):
r = []
for i,v in enumerate(height):
if v != h:
r.append(i)
break
for i, v in enumerate(height[::-1]):
if v != h:
r.append(len(height) - i - 1)
break
sum = 0
for i,v in enumerate(height):
if v == h and i < r[0]:
height[i] += 1
if v == h and r[0]<= i <= r[1]:
sum += 1
height[i] += 1
if v == h and i > r[1]:
height[i] += 1
return sum,height
思路2:
执行用时 : 40 ms, 在Trapping Rain Water的Python3提交中击败了100.00% 的用户
内存消耗 : 13.3 MB, 在Trapping Rain Water的Python3提交中击败了96.92% 的用户
- 找出最高点
- 分别从两边往最高点遍历:如果下一个数比当前数小,说明可以接到水
class Solution: def trap(self, height): maxh = max(height) maxh_index= height.index(maxh) res = 0 tmp = height[0] for i in range(maxh_index): if height[i] > tmp: tmp = height[i] else: res += (tmp - height[i]) tmp = height[-1] for i in reversed(range(maxh_index + 1, len(height))): if height[i] > tmp: tmp = height[i] else: res += (tmp - height[i]) return res