算法练习:接雨水问题

**

问题描述

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

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6

**

解题思路:

**
先找出最高的柱子,然后从两边向其遍历,如果后一个高度比前一个柱子高度低,则可以存水,存水量是两根柱子的差值

**

解题代码:

**

 public static int trp(Integer[] height){
 // 柱子数量
        int length = height.length;
        //存储水记录
        int water = 0;
        //左右两个下标
        int l = 0,r = length - 1;
        //左右存水水岸高度
        int left_max = 0,right_max =  0;
        while(l<r){
            left_max = max(left_max,height[l]);
            right_max = max(right_max,height[r]);
            if(left_max<right_max){
                water += left_max - height[l++];
            }else{
                water += right_max - height[r--];
            }
        }
        return water;
    }

::这个题因该是困难题中最简单的,不过在代码书写上需要注意,如果按照平常的平铺方法理解问题然后写代码,那么就需要三个方法(找最高柱子,从左开始遍历,从右开始遍历),将三个算法综合到一起,就得到上面代码,代码量相对来说少很多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值