leedcode:接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水?

题目分析:

一:

二:

三:

我们可以使用动态规划去实现

class Solution {
    public int trap(int[] height) {
        /**
		 * 求取存储雨水量,也就是获取每列上方存储雨水数量
		 * 针对与当前列,只有左右两边的柱子都高于当前列,当前列的上方才能储存水
		 * 当前列能存储的水 等于两边的最小值减去当前列的值,有落差才能存雨水
		 * 需要找到当前列左右两边最高柱子高度
		 */
		
		int sum=0;	
		//左边柱子高度
		int[] leftH=new int[height.length];
		
		//右边柱子高度
		int[] rightH=new int[height.length];
		
		for(int i=1;i<height.length;i++) {
			leftH[i]=Math.max(leftH[i-1], height[i-1]);
		}
		
		for (int i = height.length - 2; i >= 0; i--) {
			rightH[i]=Math.max(rightH[i+1], height[i+1]);
		}
		//第一个和倒数第一个是存储不了水的
		for(int i=1;i<height.length-1;i++) {
			
			//获取柱子两边的最小值
			int minH=Math.min(leftH[i],rightH[i]); 
			
			//最小值需要大于当前柱子才能存储水
			if(minH>height[i]) {
				sum=sum+(minH-height[i]);
			}
		}
		
		return sum;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值