题目
给定 n 个非负整数表示每个宽度为 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 个单位的雨水(蓝色部分表示雨水)。
示例二:
输入:height = [4,2,0,3,2,5]
输出:9
思路
显然可以利用单调栈的思路解题。
单调栈的含义就是维护一个单调递减的栈,具体来说有两种操作:
- 当前柱子比stack.peek()低,直接入栈
- while(当前柱子比stack.peek()高){
stack.pop()
}
在push和pop的过程中,我们可以利用柱子之间的距离和高度差计算接水量。题目中给出柱子的宽度都是1,因此增加的水量可以通过以下公式计算:
ans += 高度差*距离;
高度差 = max(左柱子,右柱子)-中间的矮柱子
中间的矮柱子 = stack.top()
代码
class Solution {
public:
int trap(vector<int>& height) {
stack<int> down;
int ans=0,basin=0,mount=0,pos=0;
if(height.size()==0)return 0;
down.push(0);
for(int i=1;i<height.size();i++){
if(!down.empty() && height[down.top()]<height[i]){
basin=height[down.top()];
down.pop();
while(!down.empty() && height[down.top()]<height[i]){
pos=down.top();
mount=height[pos];
ans+=(mount-basin)*(i-pos-1);
basin=mount;
down.pop();
}
if(!down.empty()){
pos=down.top();
mount=height[i];
ans+=(mount-basin)*(i-pos-1);
}
}
down.push(i);
}
return ans;
}
};
复杂度
时间 | 空间 |
---|---|
O(n) | O(n) |
栈内每个元素可能访问两次(push和pop) | 极端条件下(单调数列)栈的空间复杂度为n |
这里是超可爱的逸仔,如果我的题解对你有帮助的话请给我点赞、留言哦!
❤❤