LeetCode Hot 100:42. 接雨水 - 教程

题目

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

解析

和题目 盛水最多的容器 类似,

LeetCode Hot 100:11. 盛最多水的容器-CSDN博客

只是这里将每一个柱子视为一个宽度为1的容器,能接水的体积取决于左边最大高度和右边最大高度的较小值,再减去底部当前柱子的高度。设置左右指针left和right,指向左右两侧当前待计算接水量的柱子,以及记录左指针以左、右指针以右的最大高度值的pre_max和suf_max两个变量。

作者:灵茶山艾府

来源:

盛最多水的容器 接雨水【基础算法精讲 02】_哔哩哔哩_bilibili

答案

注意while循环可以不加等号,因为在「谁小移动谁」的规则下,相遇的位置一定是最高的柱子,这个柱子是无法接水的。

作者:灵茶山艾府

来源:42. 接雨水 - 力扣(LeetCode)

/**
* @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),仅用到若干额外变量。

posted @ 2025-08-05 21:10  yfceshi  阅读(10)  评论(0)    收藏  举报