python 算法, 接雨水

612 阅读1分钟

题目规则

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

如图所示,蓝色的代表接到的雨水

image

解题思路

先取得列表中最高的柱子的高度,拆分成此高度的层数,逐层遍历,每层去除两边高度为0的柱子, 每层遍历完之后执行每跟柱子高度-1

def rain(height):
    """
    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水
    个人思路: 先取得列表中最高的柱子的高度,拆分成此高度的层数,逐层遍历,每层去除两边高度为0的柱子, 每层遍历完之后执行每跟柱子高度-1
    :param height:
    :return:
    """

    # 小于或等于2跟柱子时,无法储存水
    if len(height) <= 2:
        return 0

    max_hei = max(height)   # 取最高的柱子高度
    all = 0   # 计算总储存水量

    for i in range(max_hei):
        for l in range(len(height)):
            if i == 0:      # 遍历第一层的时候 不执行 柱子高度 -1 操作
                break
            if height[0] == 0:
                height.append(0)
                del height[0]
            else:
                height.append(height[0] -1)
                del height[0]
        # print("第%s层 => %s" % (i + 1, height))

        for j in range(len(height)):
            if height[0] == 0:
                del height[0]
            else:
                break

        for k in range(len(height)-1,0,-1):
            if height[-1] == 0:
                del height[-1]

        all += height.count(0)

    print("总存储水量 => ",all)
    return all
**仅供参考,如有问题, 望指正**