思路:用单调栈找每个障碍物左边第一个比它高的位置,累加两障碍物之间的储雨量,注意最后栈内元素是呈降序排列的。
该题与AcWing的一道题相同: AcWing 1574. 接雨水
class Solution {
public:
int trap(vector<int>& height) {
vector<int> q(110, 0); //q为单调栈(数组模拟)
int n = height.size();
int res = 0;
int tt = -1; //tt为栈顶指针,q[tt]为障碍物序号
//h[q[tt]]表示序号为q[tt]的障碍物的高度
for (int i = 0; i < n; i ++ )
{
int last = 0; //储存上一个高度
while (tt >= 0 && height[q[tt]] < height[i]) //栈不为空且栈顶元素小于等于当前元素时
{
//在删掉一个较矮的障碍物前,先计算它与前一障碍物的储水量
//两障碍物间雨水容量 = 两障碍物高度差 * 两障碍物距离
res += (height[q[tt]] - last) * (i - q[tt] - 1);
last = height[q[tt]];
tt -- ;
}
if (tt >= 0) res += (height[i] - last) * (i - q[tt] - 1);
q[ ++ tt] = i; //当前障碍物入栈
}
return res;
}
};