题目
给定 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),仅用到若干额外变量。