42. 接雨水
leetcode Hot 100系列
文章目录
- 一、核心操作
- 二、外层配合操作
- 三、核心模式代码
- 总结
一、核心操作
- 单调栈,保持栈底到栈顶从高到低
- 一旦当前值大于栈顶,则记录中间柱子的下标,再弹出栈顶,
一旦栈不为空
此时就有了柱子和左右边的柱子 - 计算面积,取左右较小值减中间柱子的高度,取右-左-1作为宽度,累加
- 当前值入栈
提示:小白个人理解,如有错误敬请谅解!
二、外层配合操作
- 外层循环
- 内层循环只有栈不为空时再来计算
- 内层循环完了再将当前值入栈!!!!!
三、核心模式代码
代码如下:
class Solution {
public:
int trap(std::vector<int>& height) {
int res=0;
std::stack<int> st;
int n=height.size();
for(int i=0;i<n;i++)
{
while (!st.empty() && height[i]>height[st.top()])
{
int mid=st.top();
st.pop();
if(!st.empty())
{
int h=std::min(height[i],height[st.top()])-height[mid];
int w=i-st.top()-1;
res+=h*w;
}
}
st.push(i);
}
return res;
}
};
总结
- 所有值都要入栈!栈不为空时才累加