42.接雨水
题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
思路
从左边出发 找到所有右端大于等于左端的水槽
从右边出发 找到所有右端小于左端的水槽
加起来就是 所有的水槽
代码
下面展示一些 内联代码片
。
// A code block
var foo = 'bar';
class Solution:
def trap(self, height: List[int]) -> int:
def fuction(l, r):
h = min(height[l], height[r])
v = h * (r - l - 1)
for i in range(l + 1, r):
if height[i] < h:
v -= height[i]
else:
v -= h
return v
l = 0
r = 0
flag = False
res = 0
height.append(0)
while r < len(height) - 1:
if flag:
if height[r] < height[r + 1]:
r += 1
else:
if height[r] >= height[l]:
res += fuction(l, r)
#print(l, r, res)
flag = False
l = r
else:
flag = False
r += 1
else:
if height[r] > height[r + 1]:
r += 1
else:
flag = True
r += 1
height.pop()
height = [0] + height
r = len(height) - 1
l = r
flag = True
while l > 0:
#print(l, r, flag, height[l], height[l-1])
if flag:
if height[l] > height[l - 1]:
l -= 1
else:
flag = False
l -= 1
else:
if height[l] < height[l -1]:
l -= 1
else:
if height[l] > height[r]:
res += fuction(l, r)
#print(l, r, res)
flag = True
r = l
else:
falg = True
l -= 1
return res
执行效率
执行用时:
40 ms, 在所有 Python3 提交中击败了94.47%的用户
内存消耗:
15.2 MB, 在所有 Python3 提交中击败了28.79%的用户
题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。