本文最后更新于588 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
https://programmercarl.com/0042.%E6%8E%A5%E9%9B%A8%E6%B0%B4.html
1.本题是双指针和单调栈的比较经典的题目,本题的单调栈的思路还算是比较简单,主要就是要能够盛放雨水的区域,首先的区域就是要有一个底和两个边界,栈顶元素即为底,入栈的符合else里的操作的就是该元素右边第一个大于他的值,然后我们还需要一个左面的边界也就是栈顶元素右面在栈里的值就是小于他的值,是因为我们这个单调栈是单调递增的操作。tips:本题我出现的问题是在弹出栈顶元素之后再取栈顶元素前没有判断是否栈空。
CPP
class Solution {
public:
int trap(vector<int>& height) {
if(height.size() <= 2)return 0;
stack<int> st;
st.push(0);
int h = 0;
int w = 0;
int res = 0;
for(int i = 1; i < height.size(); i++){
if(height[i] <= height[st.top()]){
st.push(i);
}else{
while(!st.empty() && height[i] > height[st.top()]){
int mid = st.top();
st.pop();
if(!st.empty()){
h = min(height[st.top()], height[i]) - height[mid];
w = i - st.top() - 1;
res += h * w;
}
}
st.push(i);
}
}
return res;
}
};