码迷,mamicode.com
首页 > 其他好文 > 详细

42. 接雨水

时间:2020-04-06 22:14:16      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:trap   图片   distance   bre   就是   单位   span   一个   solution   

给定 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)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

看到这样的题目一般能快速想到的办法就是双指针了,last指针记录上一波的最高柱子,另一个从0开始递增,

在遇到height[i] >= height[last_top]的时候,将i和last之间的高度差累计

OK,可是这样会遇到个问题,在遇到最高的柱子右边的时候这规则就不适用了,是不是这样双指针就不行了呢。

nonono,换个方向想想看,把整片柱子分开两段,最高柱子的左边和最高柱子的右边,

这不就是两个双指针的思路么,最后就很容易计算最后的值了

class Solution {
public:
    int trap(vector<int>& height) {
       int last_top(0);
    int ret(0);
    int top_index(0);//

    for (int i=0;i < height.size(); i++)
    {
        if (height[i] > height[top_index]) {
            top_index = i;
        }
    }
    //1
    for (int i = 1; i <= top_index;)
    {
        if (height[i] >= height[last_top])
        {
            for (int j = last_top+1; j < i;++j)
            {
                ret += height[last_top] - height[j];
            }
            last_top = i;
            i++;
        }
        else{
            i++;
        }
    }
    last_top = height.size() -1;
    for (int i = last_top - 1; i >= top_index;)
    {
        if (height[i] >= height[last_top])
        {
            for (int j = last_top - 1; j > i; --j)
            {
                ret += height[last_top] - height[j];
            }
            last_top = i;
            i--;
        }
        else        {
            i--;
        }
    }
    return ret;     
    }
};

 

想复杂点的话,可以按照LeetCode官方解题,使用栈(好像这样比较高级,速度也比较快)

用一个栈记录在遇到 height[current] > height[st.top() 之前的所有柱子的序号

 

class Solution {
public:
    int trap(vector<int>& height) {
           int ans = 0, current = 0;
    stack<int> st;
    while (current < height.size()) {
        while (!st.empty() && height[current] > height[st.top()]) {
            int top = st.top();
            st.pop();
            if (st.empty())
                break;
            int distance = current - st.top() - 1;
            int bounded_height = min(height[current], height[st.top()]) - height[top];
            ans += distance * bounded_height;
        }
        st.push(current++);
    }
    return ans; 
    }
};

 

42. 接雨水

标签:trap   图片   distance   bre   就是   单位   span   一个   solution   

原文地址:https://www.cnblogs.com/gongkiro/p/12649992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!