过程示意图:
代码解读:
class Solution {
public:
int trap(vector<int>& height) {
int ans = 0;
stack<int> stk;
int n = height.size();
for (int i = 0; i < n; ++i) {
//栈中记录的是数组的索引,同时也是坐标轴的横坐标
while (!stk.empty() && height[i] > height[stk.top()]) {
int top = stk.top();
stk.pop();
if (stk.empty()) {
break;
}
//更新当前数据
//此处得到一个左边的数据,以便判断是否能形成槽
int left = stk.top();
int currWidth = i - left - 1;
//根据木桶效应,把左右两边矮的那个决定这个桶能装水的深度
int currHeight = min(height[left], height[i]) - height[top];
//更迭答案
ans += currWidth * currHeight;
}
stk.push(i);
}
return ans;
}
};