Leetcode—— trapping-rain-water

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example, 
Given[0,1,0,2,1,0,1,3,2,1,2,1], return6.

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!



解题思路:

类似于前述最大矩形解法,前为切头,此为填坑,异曲同工;

同理,可改为stack,复杂度为O(n): 将计算过的部分弹栈,认为其高度等于当前新水坝高度。

复杂度为O(n^2);

class Solution {
public:
    int minn( int a, int b){
        if( a < b){
            return a;
        }
        return b;
    }
    int trap(int A[], int n) {
        //记录左侧水坝最大高度
        //每次加入新水坝,判断是否满足蓄水条件(水坝高度是否大于前一个水坝)
        //更新储水量,并填坑。
         
        //更新储水量:直至找到左侧最大高度的水坝或和当前水坝一样高的水坝
        //填坑:为防止重复计算,将计算过的地方填平。
        int sum = 0;
        int maxLeft = A[0];
        for(int i= 1 ; i< n ; i++ ){
            //满足蓄水条件
            if( A[i] > A[i-1] ){
                int cur = minn(maxLeft,A[i]);
                int cnt = 0;
                int k = i-1;
                while( A[k] < cur ){
                    cnt -= A[k];
                    A[k] = cur;
                    k--;
                }   
                cnt += cur * (i - k -1);
                sum += cnt;
            }
            //更新maxLeft;
            if( A[i] > maxLeft){
                maxLeft = A[i];
            }
        }
        return sum;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值