通过这个题可以对单调栈有更好的理解。
单调栈就是一个保存单调递增或递减的栈,只要记住这一点,这个题就不难解
在一个凹槽内[i,j]
,水是平的,因此只需要知道凹槽最小的那一边(木桶效应)以及原来水的高度h
,就可以知道这个凹槽应该还能加入多少的水(最小那一边的高度 - h) * (i - j - 1)
由于每次进入一个新的数height[i]
就把之前的凹槽填平(height[i]
之前的高度在调整之后,只能是单调递减的),可以维护一个单调栈,
class Solution {
public:
int trap(vector<int>& height) {
int res = 0;
stack<int> sta;
for(int i = 0; i < height.size(); i++)
{
while(!sta.empty() && height[i] > height[sta.top()])
{
// 填平之前的凹槽
int mid = sta.top(); // h
sta.pop();
// 如果没有最左边
if(sta.size() == 0)
break;
// min(height[i], height[sta.top()] 最小一边的高度
res += (min(height[i], height[sta.top()]) - height[mid]) * (i - sta.top() - 1);
}
// 在栈里一定保持单调递减,因为凹下去的部分已经被填平了
sta.push(i);
}
return res;
}
};