2020-11-20

 

题目描述

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

输入描述:

逗号分隔的整数,表示每根柱子的高度。
柱子数n<=1000000,每根柱子的高度不大于100000

输出描述:

雨水量(高度和)
输入输出
0,1,0,2,1,0,1,3,2,1,2,16

思路1:

由底层逐渐向上递归统计每层可接雨水的量,每层统计方式:设置起始/结束标记位,中间的面积即为该区域可接雨水的量,循环遍历;并将柱子高度减1,继续循环;

data=[int(x) for x in input().split(',')]
area=0
def fun(data):
    global area
    l_index=-1
    r_index=-1
    if max(data)>0:
        for i,d in enumerate(data) :
            if d>0:
                if l_index==-1:
                    l_index=i
                    r_index=i
                else:
                    l_index=r_index
                    r_index=i
                    area += (r_index - l_index - 1)
                data[i]-=1
        fun(data)
fun(data)
print(area)

思路2:

装满水后的整体形状必然是单峰型。所以先从左边遍历,找到最高柱子的位置,然后从左端开始遍历到该位置,凡遇到右边相邻柱子低于左边的,将其填充为左边柱子高度,累加填充值。再用同样的方法从右边遍历,继续累加填充值。最后再将左右峰值位置之间的所有柱子填充为峰值高度,继续累加填充值。输出填充值即可。

a=list(map(int,input().split(',')))

def rain(lenth):
    rains,maxhight=0,0
    for i in lenth:
        if i>maxhight:#当前值比之前最大值高,则不接雨水
            maxhight = i
        else:#当前值比之前最大值低,差值即为雨水量
            rains+=maxhight-i
    return rains

mid=a.index(max(a))#x寻找中间最大值
b=a[:mid]
c=a[mid+1:]
c=c[::-1]
print(rain(b)+rain(c))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值