雨水,lintcode

给出 n 个非负整数,代表一张X轴上每个区域宽度为 1 的海拔图, 计算这个海拔图最多能接住多少(面积)雨水。
样例
如上图所示,海拔分别为 [0,1,0,2,1,0,1,3,2,1,2,1], 返回 6.

一刷没有ac
解题思路:用两个指针像中间夹,记录左右保持的左最大和右最大,每次判断两者大小向中间移动,移动的时候计算res。时间O(n),空间O(1)。

public class Solution {
    /**
     * @param heights: an array of integers
     * @return: a integer
     */
    public int trapRainWater(int[] heights) {
        int res = 0;
        if(heights == null || heights.length == 0) return res;
        int lmax = 0, rmax = 0;
        int l = 0;
        int r = heights.length-1;
        while(l < r){
            lmax = Math.max(lmax, heights[l]);
            rmax = Math.max(rmax, heights[r]);
            if(lmax > rmax){
                res += rmax - heights[r];
                r--;
            }else{
                res += lmax - heights[l];
                l++;
            }
        }
        return res;
    }
}

如果考虑时间O(n),空间O(n)的话,可以从左遍历纪录最大,然后从右遍历,开始计算右最大,在两者中取最小,在某点的水量应该是两者最小和此处高度的差

public class Solution {
    /**
     * @param heights: an array of integers
     * @return: a integer
     */
    public int trapRainWater(int[] heights) {
        if(heights == null || heights.length == 0) return 0;
        int[] res = new int[heights.length];
        int max = 0;
        for(int i = 0; i < heights.length; i++){
            max = Math.max(max, heights[i]);
            res[i] = max;
        }
        max = 0;
        int result = 0;
        for(int i = heights.length - 1; i >= 0; i--){
            max = Math.max(max,heights[i]);
            result += Math.min(max, res[i]) - heights[i];
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值