[题记]接雨水-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


思路:利用栈的思想。

 

我们可以利用栈来存放坐标,当栈顶高度大于当前位置时候,表明是没有凹坑的,我们将当前位置的坐标压入栈,但是如果当前栈顶的高度小于当前高度,就说明是有凹坑了,此时我们需要去计算这个凹坑的高度和宽度。

注意:在计算高度的时候,一开始的栈顶相当于是凹坑的底边界值,我们需要保存这个栈顶后将它弹出,然后在栈中找到能够使这个凹坑成立的左边的高度,然后在计算高度的时候减去保存的那个栈顶。

大致步骤为:

  1. 如果栈顶高度大于当前位置的高度,将当前位置的坐标压入栈。
  2. 如果当前高度大于当前栈顶的高度:
    • 获取当前的栈顶后弹出栈顶。
    • 然后计算此时栈顶与当前位置能够存放水的宽度
    • 计算此时栈顶与当前位置能够存放水的高度
    • 更新总接水量。

 

代码(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

 

posted @ 2020-04-04 14:32  橙橙橙澄xs  阅读(113)  评论(0编辑  收藏  举报