目录
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
实现代码与解析:
单调栈
class Solution {
public:
int trap(vector<int>& height) {
int res = 0;
stack<int> st;
for (int i = 0; i < height.size(); i++)
{
while (st.size() && height[i] > height[st.top()])
{
int mid = st.top(); // 中间
st.pop();
if (st.empty()) break; // 需要有左侧墙
int l = st.top(); // 左侧
int w = i - l - 1; // 宽度
int h = min(height[l], height[i]) - height[mid]; // 高度为左右墙中最低的减去中间的
res += w * h;
}
st.push(i);
//循环过后,左侧的墙就会变为下一次中间的墙,从而填满其他层
}
return res;
}
};
原理思路:
单调栈,和一般的单调栈差不多,但是这里栈中必须要有两个元素来构成左侧和在中间,如果只有一个元素,那么不能装雨水,右侧墙就为第一个比其大的值,
和下面单调栈的题同。Leetcode:496. 下一个更大元素 I、503. 下一个更大元素 II(单调栈C++)_Cosmoshhhyyy的博客-CSDN博客
宽度就为其左侧和右侧的差值+1,高度显然就为左右两侧的最小值减去中间,然后相乘算出此次两侧墙高度差能装的体积。
大家最好根据代码和例子的图片带入演绎一遍,可以更好的理解,光看代码一上来确实有点懵。