LeetCode Hot 100:42. 接雨水 - 教程
题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
解析
和题目 盛水最多的容器 类似,
LeetCode Hot 100:11. 盛最多水的容器-CSDN博客
只是这里将每一个柱子视为一个宽度为1的容器,能接水的体积取决于左边最大高度和右边最大高度的较小值,再减去底部当前柱子的高度。设置左右指针left和right,指向左右两侧当前待计算接水量的柱子,以及记录左指针以左、右指针以右的最大高度值的pre_max和suf_max两个变量。
作者:灵茶山艾府
来源:
答案
注意while循环可以不加等号,因为在「谁小移动谁」的规则下,相遇的位置一定是最高的柱子,这个柱子是无法接水的。
作者:灵茶山艾府
/**
* @param {number[]} height
* @return {number}
*/
var trap = function(height) {
const len = height.length;
let left = 0, right = len - 1, ans = 0; //设置左右指针和初始答案
//初始化前缀最大高度(左指针以左),后缀最大高度(右指针以右)
let pre_max = 0, suf_max = 0;
while(left < right) {
pre_max = Math.max(pre_max, height[left]); //更新前缀最大高度
suf_max = Math.max(suf_max, height[right]); //更新后缀最大高度
if(pre_max < suf_max) { //判断储水高度,取决于前缀、后缀最大高度中的短边
ans += pre_max - height[left]; //实际可储水高度需要减去底部柱子的高度
left++;
} else {
ans += suf_max - height[right];
right--;
}
}
return ans;
};
复杂度分析
时间复杂度:O(n),其中 n 为 height 的长度。
空间复杂度:O(1),仅用到若干额外变量。