Trapping Rain Water

1.题目

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

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

2.算法

算法1:基本思路是维护一个数组,记录一个数左边和右边的最大高度的最小值,如上图所示第3个数是0,左边最大为1,右边最大高度为2取1,又由于第3个数为0则能接1面积雨水。

    public int trapRainWater(int[] heights) 
    {
    	if (heights == null || heights.length == 0)
    	{
    		return 0;
    	}
    	int max = 0;
    	int res = 0;
    	int[] container = new int[heights.length];
    	for (int i = 0; i < heights.length; i++)  //从左向右找最大值
    	{
    		container[i] = max;
    		max = Math.max(max, heights[i]);
    	}
    	max = 0;
    	for (int i = heights.length - 1; i >= 0; i--) //从右往左找最大值
    	{
    		container[i] = Math.min(max, container[i]);
    		max = Math.max(max, heights[i]);
    		res += container[i] - heights[i] > 0 ? container[i] - heights[i] : 0;//得出成水量
    	}
    	return res;
    }

算法2:比较两边大小,从小边开始,往里扫描,如果内部比边上还小,可以装水,否则继续比较两边大小,直到两边相等

    public int trapRainWater(int[] heights) 
    {
    	if (heights == null || heights.length == 0)
    	{
    		return 0;
    	}
    	int res = 0;
    	int l = 0;
    	int r = heights.length - 1;
    	while (l < r)
    	{
    		int min = Math.min(heights[l], heights[r]);  //找两边小的
    		if (heights[l] == min) //如果左边小,继续扫描,装水
    		{
    			l++;
    			while (l < r && min > heights[l])
    			{
    				res += min - heights[l];
    				l++;
    			}
    		}
    		else    //如果右边小,继续扫描,装水
    		{
    			r--;
    			while (l < r && min > heights[r])
    			{
    				res += min - heights[r];
    				r--;
    			}
    		}
    	}
    	return res;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值