和小伙伴们一起玩的接雨水游戏

接雨水

题目来源

在这里插入图片描述

解题思路

  • 雨水的位置:左右侧比其高(核心条件)
  • 雨水的容量:左右侧相对较低的一侧(木桶理论)
import pygal                            
from IPython.display import HTML

data = [0,1,0,2,1,0,1,3,2,1,2,1]
nums = len(data)
rain = []                            # 收集雨水
limit = 0                            # 判断某列是否可以参与接雨水

for num in range(nums):
    rain.append(0)                   # 每一列初始与水量默认为0

for i in range(1,nums-1):            # 首尾列无法接雨水,不参与循环
    if i < limit:                    
        continue
    if data[i] < data[i-1]:          # 条件1:无论雨水是以“单滴”还是“多滴”的形式,其最左侧所在列一定矮于相邻左侧的列
        right_index = 0              # 右侧列的位置
        left = data[i-1]             # 左侧高度
        right = data[i]              # 右侧高度暂时由当前高度赋值
        j = i + 1
        while j != nums:             
            if data[j] > right:      # 确定右侧最高柱的位置
                right = data[j]
                right_index = j
            if data[j] >= left:      # 若右侧柱的高度不小于左侧柱,便形成一个容器,则可提前结束循环
                break
            j += 1
        min_column = min(left, right)         # 雨水边界的较矮柱
        if right != data[i]:                  # 情况1:右侧最高柱不矮于左侧
            limit = j
        if right == min_column:               # 情况2:右侧最高柱较左侧矮
            limit = right_index
        for k in range(i, right_index):
            rain[k] = min_column - data[k]    # 计算每列雨水的容量
    else:                                     # 不满条件1,继续循环
        continue
# 数据的可视化分析
line_chart = pygal.StackedBar()
line_chart.title = "Let's play a game: Trapping rain water."
line_chart.x_labels = map(str,range(1,len(data)+1))
line_chart.add('Columns', data)
line_chart.add('Rain',rain)
HTML(line_chart.render().decode())         # jupyter notebook 需要使用HTML类进行渲染绘图

jupyter notebook的运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值