lintcode363-接雨水

题目描述:

要求能接水的数量。每个位置能不能接水,能接多少水,取决于该位置左右两边的最高高度中的较小者。如果该位置就是从左边开始的最高高度,则该位置不能接水,如果该位置不是左右两边的最高高度,则该位置能接的水量就是左右最高高度中的较小者减去该位置的高度。最左边和最右边不管是不是最高高度,都不能接水。

为能快速得到某一位置左边的最高高度和右边的最高高度,采用两个数组left和right。

left[i] 表示0~i(包括i)的最高高度;  right[i] 表示i~len-1(包括i)的最高高度。

代码:

int trapRainWater(vector<int> &heights) {
        // write your code here
        if(heights.empty())
            return 0;
        
        vector<int> left(heights.size());
        vector<int> right(heights.size());
    
        int maxH = heights[0];
        left[0] = heights[0];
        for(int i=1; i<heights.size(); ++i){
            if(heights[i] < maxH){
                left[i] = left[i-1];
            }
            else{
                left[i] = heights[i];
                maxH = heights[i];
            }
        }
    
        int len = heights.size();
        maxH = heights[len-1];
        right[len-1] = maxH;
        for(int i=len-2; i>=0; --i){
            if(heights[i] < maxH){
                right[i] = right[i+1];
            }
            else{
                right[i] = heights[i];
                maxH = heights[i];
            }
        }
    
        int res = 0;
        for(int i=0; i<heights.size(); ++i){
            if(heights[i] == left[i] || heights[i] == right[i]){
                continue;
            }
    
            int h = min(left[i], right[i]);
            res += (h - heights[i]);
        }
        return res;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值