题目描述
给定n个非负整数表示每个宽度为1的柱子的高度题,计算按此排列的柱子,下雨之后能接多少雨水。
输入描述:
逗号分隔的整数,表示每根柱子的高度。 柱子数n<=1000000,每根柱子的高度不大于100000
输出描述:
雨水量(高度和)
输入 | 输出 |
0,1,0,2,1,0,1,3,2,1,2,1 | 6 |
思路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))