LeetCode OJ算法题(四十一):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], return 6.

解法:

一开始我以为只用找出所有的极大值,然后在没两个极大值的区间里把水的体积计算出来即可。对于上图给出的样例,可以通过,但是对于[5,2,1,2,1,5]这种洼地,容积取决于最高的挡板,所以这种思路有问题。

正确的思路是找出最高的那一块挡板,下标即为maxindex,然后分别从左和右逼近maxindex,在逼近的过程中计算水的容积

以左边逼近为例:

1、若遍历的挡板高度A[left]小于之前挡板的最大高度A[maxleft],则它可以装水,装的水量为A[maxleft]-A[left];

2、若遍历到的挡板高度A[left]大于或等于之前的最大高度,则更新maxleft 为left

注意:这样每一个maxleft其实并非所有的极大值点~

右边逼近与左边类似,代码如下:

public class No41_TrappingRainWater {
	public static void main(String[] args){
		System.out.println(trap(new int[]{5,2,1,2,1,5}));
	}
	public static int trap(int[] A) {
		if(A.length < 3) return 0;
		int maxindex = 0;
		for(int i=0;i<A.length;i++){
			if(A[i] > A[maxindex])
				maxindex = i;
		}
		int ret = 0;
		int maxleft = 0;
		for(int left=0;left<maxindex;left++){
			if(A[left]<A[maxleft]) 
				ret += A[maxleft] - A[left];
			else
				maxleft = left;
		}
		int maxright = A.length-1;
		for(int right=A.length-1;right>maxindex;right--){
			if(A[right]<A[maxright])
				ret += A[maxright] - A[right];
			else
				maxright = right;
		}
        return ret;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值