Const
宽度 × 高度
时间复杂度: O(n)
空间复杂度: O(n)
function trap(hs: number[]): number {
const n = hs.length;
let ans = 0;
const st: number[] = [0]; // 维护递减单调栈,存储索引
for (let i = 1; i < n; i++) {
// 当遇到比栈顶高的柱子时,可以计算接水量
while (st.length > 0 && hs[i] > hs[st[st.length - 1]]) {
const top = st.pop()!;
// 如果栈为空,说明左边没有更高的柱子,无法接水
if (st.length === 0) {
break;
}
// 计算接水量:宽度 * 高度
const l = st[st.length - 1]; // 左边第一个比top高的柱子
const w = i - l - 1; // 宽度
const h = Math.min(hs[i], hs[l]) - hs[top]; // 高度
ans += w * h;
}
st.push(i);
}
return ans;
}
42.接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:
height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:
6
解释: 如下图所示,6 单位雨水被接收。
示例 2:
输入:
height = [4,2,0,3,2,5]
输出:
9
提示:
n == height.length
1 <= n <= 2 * 10^4
0 <= height[i] <= 10^5