written at 20/06/01

题目描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
LeetCode 42 - 接雨水 - 图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)

代码

  1. class Solution(object):
  2. def trap(self, height):
  3. """
  4. :type height: List[int]
  5. :rtype: int
  6. """
  7. if len(height) < 2: # mark
  8. return 0
  9. N = len(height)
  10. l, r = [0]*N, [0]*N
  11. l[0], r[N-1] = height[0], height[N-1]
  12. base = l[0]
  13. for i in range(1,N):
  14. l[i] = max(l[i-1], height[i])
  15. base += height[i]
  16. all_vol = height[N-1]
  17. for i in range(N-2, -1, -1):
  18. r[i] = max(r[i+1], height[i])
  19. all_vol += min(r[i], l[i])
  20. return all_vol - base