LintCode-接雨水

给出 n 个非负整数,代表一张X轴上每个区域宽度为 1 的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。

《LintCode-接雨水》

样例

如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.

挑战

O(n) 时间, O(1) 空间

O(n) 时间, O(n) 空间也可以接受

分析:只能遍历一遍,且不能存储所有的高度,一块直柱能接的水取决于左右两边较短的高度,所以一个比较直观的方法是从左到有遍历一遍记录该点左边的最大值,从右到左遍历一遍记录该点的右边的最大值,此方法为O(n) 时间, O(n) 空间,第二种方法可以利用单调递减栈来实现,此方法为O(n) 时间, O(n) 空间,第三种方法为先找出中间最大点,然后左边部分相当于已经确定了右边最大值,左指针不断向右逼近就行,右边部分相当于记录了左边最大值,右指针不断向左逼近就行,此方法为O(n) 时间, O(1) 空间,第四种方法类似第三种,左右夹逼,每次选择小的那个指针向中间靠拢,此方法为O(n) 时间, O(1) 空间,但是要比方法三少遍历一遍。

我们在这里实现第四种最优的方案:

代码:

class Solution {
public:
    /**
     * @param heights: a vector of integers
     * @return: a integer
     */
    int trapRainWater(vector<int> &heights) {
        // write your code here
        int ret = 0;
        if(heights.size()==0)
            return ret;
        int lmax = 0, rmax = 0;
        int l = 0, r = heights.size()-1;
        while(l<r)
        {
            lmax = max(lmax,heights[l]);
            rmax = max(rmax,heights[r]);
            if(lmax<rmax)
                ret += lmax-heights[l],l++;
            else
                ret += rmax-heights[r],r--;
        }
        return ret;
    }
};
    原文作者:LintCode题目解答
    原文地址: https://blog.csdn.net/wangyuquanliuli/article/details/45742981
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞