2019/11/17【接雨水】

题目一:【接雨水】力扣——42

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

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

示例:

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

脚本:

#!/bin/bash
#接雨水
#author:yzt 2019-11-17
#
read -t 40 -p "请输入数组:" contents
declare -i aa=1
declare -i bb=1
cat /dev/null >result.txt
echo "$contents"|sed 's#\[\|\]##g'|sed 's#,#\n#g'|grep -n -v "^$" >tmp1.txt
total=`cat tmp1.txt|wc -l`
while :
do
        i=`sed -n "$bb p" tmp1.txt`
        hangshu1=`echo "$i"|awk -F : '{print $1}'`
        zhugao=`echo "$i"|awk -F : '{print $2}'`
        hangshu2=`sed "$aa,$bb d" tmp1.txt|awk -F : -v j=$zhugao '$2>=j{print $1}'|head -n1`
        hangshu3=`sed "$aa,$bb d" tmp1.txt|awk -F : -v j=$zhugao '$2<j{print $0}'\
|sort -n -t ":" -k 2|tail -n1|awk -F : '{print $1}'`
        if [ ! -z $hangshu3 ];then
                zhugao1=`sed -n "$hangshu3 p" tmp1.txt|awk -F : '{print $2}'`
        fi
        if [ ! -z $hangshu2 ];then
                length1=$[$hangshu2-$hangshu1]
                shuiliang1=$[$zhugao * $length1]
                hangshu4=$[$hangshu2-1]
                sed -n "$hangshu1,$hangshu4 p" tmp1.txt|awk -F : '{print $2}' > tmp2.txt
                sum=0
                for j in `cat tmp2.txt`
                do
                        sum=$[$sum+$j]
                done
                shuiliang1=$[$shuiliang1-$sum]
                echo "$shuiliang1" >>result.txt
                bb=$hangshu2
        else
                if [ -z $hangshu3 ];then
                        break
                else
                        length2=$[$hangshu3-$hangshu1]
                        shuiliang2=$[$length2 * $zhugao1]
                        hangshu5=$[$hangshu1+1]
                        sed -n "$hangshu5,$hangshu3 p" tmp1.txt|awk -F : '{print $2}' >tmp2.txt
                        sum1=0
                        for k in `cat tmp2.txt`
                        do
                                sum1=$[$sum1+$k]
                        done
                        shuiliang2=$[$shuiliang2-$sum1]
                        echo "$shuiliang2" >>result.txt
                        bb=$hangshu3
                fi
        fi
        if [ $bb -ge $total ];then
                 break
        fi
done

totle_sum=o
for item in `cat result.txt`
do
        totle_sum=$[$totle_sum + $item]
done
echo "$totle_sum"
            

【脚本逻辑】:

第一:将数组中的非负整数想象为墙高,接雨水的条件是:两墙之间有凹槽存在。

第二:从左边第一块墙,称为a墙开始,如果右边存在比a墙高(含相等)的b墙时,a墙与b墙之间能装的雨水为以a墙的高度乘以ab墙之间的宽度,并且减去a墙到b墙之前存在的小墙;如:(此时第5块墙变为左边第一块墙,继续后续操作)

第三:从左边第一块墙,墙a开始,右边并没有比墙a高或相等的墙,此时需要采用另外一种做法:

获取右边的墙中“最高且排最右边”的墙(有可能右边有两块墙是最高的),先计算出其总的容量,再减去已存在墙体的容量,最后得到雨水的容量,如下所示:(此时左边的第一块墙变为下图的第10块墙,并执行后续操作)

第四:程序将在左边第一块墙的行数大于或等于数组的个数时,退出循环,并开始计算雨水的总量。

 

脚本效果:

[root@localhost leetcode]# ./jieyushui.sh
请输入数组:[0,0,4,0,1,3,9,0,4,8,1]
20
[root@localhost leetcode]# vim jieyushui.sh
[root@localhost leetcode]# ./jieyushui.sh
请输入数组:[0,2,0,0,4,1]
4
[root@localhost leetcode]# ./jieyushui.sh
请输入数组:[0,2,0,0,4,0,1]
5
[root@localhost leetcode]# ./jieyushui.sh
请输入数组:[0,1,0,2,1,0,1,3,2,1,2,1]
6

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值