给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
来源:力扣(LeetCode)
class Solution {
public:
int trap(vector<int>& height) {
stack<int> s;
int index = 0;
int Result = 0;
while (index < height.size())
{
while (!s.empty() && height[index] > height[s.top()]) {
int CurrentIndex = s.top();
s.pop();
if (s.empty()) {
break;
}
int length = index - s.top() - 1;
Result += (min(height[index], height[s.top()]) - height[CurrentIndex]) * length;
}
s.push(index++);
}
return Result;
}
};
class Solution:
def trap(self, height: List[int]) -> int:
Result = 0
CurrentIndex = 0
stack = list()
while(CurrentIndex < len(height)):
while(len(stack) != 0 and height[CurrentIndex] > height[stack[-1]]):
Index = stack[-1]
stack.pop()
if len(stack) == 0:
break
Length = CurrentIndex - stack[-1] - 1
Result += Length * (min(height[CurrentIndex],height[stack[-1]]) - height[Index])
stack.append(CurrentIndex)
CurrentIndex += 1
return Result