42. 接雨水
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 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 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5] 输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
解析:
1、按行计算
对于第i行,遍历height,遇到高度大于等于i的,则结果变量sum += 累计变量temp,并且temp = 0
遇到高度小于i的,则temp += 1
注意当然每次要从第一个大于等于i的height开始算 时间复杂度O(mn),空间复杂度O(1)
2、按列计算
对于每列,求左右两边最高的height,如果两边最高的height都大于该列的height,则该列形成凹陷,可以储水
该列的储水容量 = 左右两边最高的height中小的那一个 - 该列的height
注意每次只看一列 时间复杂度O(n) 空间复杂度O(n)
class Solution { public: int trap(vector<int>& height) { int maxh = 0; vector<int> lefth, righth; for(int i = 0; i < height.size(); i++) { lefth.push_back(maxh); maxh = max(maxh, height[i]); } maxh = 0; for(int i = height.size() - 1; i >= 0; i--) { righth.push_back(maxh); maxh = max(maxh, height[i]); } int sum = 0; for(int i = 0; i < height.size(); i++) { if(lefth[i] > height[i] && righth[height.size() - 1 - i] > height[i]) { sum += min(lefth[i], righth[height.size() - 1 - i]) - height[i]; } } return sum; } };
3.单调栈
维持一个单调递减栈即可