题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
直观的思路就是找到左右两部分,分别的单调增序列,这便是能存储雨水的总量(去除基础石块)。然后统计基础的石块占量便可以了。时间复杂度也只有。 得注意特殊情况的判断(石块长度为0)
代码
class Solution(object):def trap(self, height):""":type height: List[int]:rtype: int"""if len(height) < 2: # markreturn 0N = len(height)l, r = [0]*N, [0]*Nl[0], r[N-1] = height[0], height[N-1]base = l[0]for i in range(1,N):l[i] = max(l[i-1], height[i])base += height[i]all_vol = height[N-1]for i in range(N-2, -1, -1):r[i] = max(r[i+1], height[i])all_vol += min(r[i], l[i])return all_vol - base
