栈
明确目标——计算接雨水的总量。
可以想到一层一层的接雨水。和算法结合,介绍思想 : 遍历柱子,栈 s t k stk stk 维护降序高度的柱子,如果出现升序,说明形成凹槽,计算凹槽能接的雨水,加入答案。
提示 : 至少有左中右 3 3 3 个柱子才能接雨水,高度 0 0 0 也算柱子。
计算雨水 : 宽 × \times ×高。我们按照层序,从下到上计算每一层雨水,这是为了柱高归一化。记录栈顶柱子(中)的坐标,弹栈。宽 = = =当前柱子和栈顶柱子的坐标差;高 = = = m i n ( min( min(当前柱高(右) , , ,栈顶柱高(左) ) − )- )−记录的中间柱高。计算每一层雨水,相加即为当前柱子左侧的接雨水总量。遍历到最后一个柱子,得到答案。
class Solution {
public:
int trap(vector<int>& height) {
int ans = 0;
stack<int> stk;
for(int i = 0;i<height.size();i++){
while(stk.size()&&height[i]>=height[stk.top()]){
int top = stk.top();
stk.pop();
if(stk.size()) ans += (i-stk.top()-1)*(min(height[i],height[stk.top()])-height[top]);
}
stk.push(i);
}
return ans;
}
};
时间复杂度 O ( n ) O(n) O(n) , 柱子总数 n n n ,每个柱子最多进栈和出栈一次,时间复杂度 O ( n ) O(n) O(n) 。
空间复杂度 O ( n ) O(n) O(n) ,栈内柱子数量不会超过 n n n ,最坏空间复杂度 O ( n ) O(n) O(n) 。
致语
理解思路很重要!
欢迎读者在评论区留言,答主看到就会回复的。