[题记]接雨水-leetcode
题目:接雨水
给定 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
思路:利用栈的思想。
我们可以利用栈来存放坐标,当栈顶高度大于当前位置时候,表明是没有凹坑的,我们将当前位置的坐标压入栈,但是如果当前栈顶的高度小于当前高度,就说明是有凹坑了,此时我们需要去计算这个凹坑的高度和宽度。
注意:在计算高度的时候,一开始的栈顶相当于是凹坑的底边界值,我们需要保存这个栈顶后将它弹出,然后在栈中找到能够使这个凹坑成立的左边的高度,然后在计算高度的时候减去保存的那个栈顶。
大致步骤为:
- 如果栈顶高度大于当前位置的高度,将当前位置的坐标压入栈。
- 如果当前高度大于当前栈顶的高度:
- 获取当前的栈顶后弹出栈顶。
- 然后计算此时栈顶与当前位置能够存放水的宽度
- 计算此时栈顶与当前位置能够存放水的高度
- 更新总接水量。
代码(c++):
class Solution { public: int trap(vector<int>& height) { stack<int> v; int ans = 0; for( int i = 0; i < height.size(); i++ ) { //栈不为空并且栈顶小于当前高度 while( !v.empty()&& height[v.top()] < height[i] ) { int t = v.top(); v.pop(); if( v.empty() ) break;//栈为空,跳出 //计算宽度和高度 int w = i - v.top() - 1; int h = min( height[i],height[v.top()]) - height[t]; ans += w * h; } v.push(i); } return ans; } };
2020-04-04-14:32:02