Python算法题集_接雨水

本文为Python算法题集之一的代码示例

题目42:接雨水

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

示例 1:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

注意:代码运行速度每次都不同,估计服务器负载有波动

  1. 分层双指针,差强人意

    ​      对图像进行分析,接雨水后高度为n+1的雨水一定在高度为n的雨水底座之上,类似金字塔;因此按高度分层,左右指针逐步向中间靠拢,最后得出雨水面积。此算法较为复杂,最终效果也差强人意。

    python 复制代码
    def trapRainWater_ext1(height):     # 分层双指针,按高度逐层上升
        ilen = len(height)
        ileft, iright, iSumbottom, iSumlevel, iLevel = 0, ilen - 1, 0, 0, 1
        while (ileft <= iright):
            while (ileft <= iright and height[ileft] < iLevel):
                iSumbottom += height[ileft]
                ileft += 1
            while (iright >= ileft and height[iright] < iLevel):
                iSumbottom += height[iright]
                iright -= 1
            iLevel += 1
            iSumlevel += iright - ileft + 1
        return iSumlevel - iSumbottom
    
    print(trapRainWater_ext1([0,1,0,2,1,0,1,3,2,1,2,1]))
    # 运行结果
    6
  2. 几何裁剪,数学之美,超越93%

基于几何图像分析,从左向右投射到最高峰,从右向左投射到最高峰,这两个面积相加,减去最高峰*宽的最高峰面积,就是装满雨水后的轮廓面积;这个轮廓面积再减去底座面积,就得出雨水占据的面积。

此算法简洁优雅,寥寥数行,速度居然超越93%的通过者

原来科学的尽头是玄学,美学的尽头是数学

python 复制代码
def trapRainWater_ext2(height): # 雨水面积=左边投射面积+右边投射面积-最高峰面积-底座面积
    result, hleft, hright = 0, 0, 0
    for iIdx in range(len(height)):
        hleft = max(hleft, height[iIdx])
        hright = max(hright, height[-iIdx - 1])
        result += hleft + hright - height[iIdx]
    return result - len(height) * hleft

print(trapRainWater_ext2([0,1,0,2,1,0,1,3,2,1,2,1]))
# 运行结果
6
  1. 双指针法,超越93%

    ​      抛弃高度分层的思路,直接使用左右指针相互靠拢;相当于去掉了一个中间层。轻装上阵后,效果也大大提高,代码虽然没有数学家优雅,效率也是超越了93%的通过者

    python 复制代码
    def traRainWater_ext3(height):  # 双指针收缩
        iLen = len(height)
        result, ileft, ileftMax, iright, irightMax= 0, 0, 0, iLen - 1, 0
        while ileft < iright:
            ileftMax = max(ileftMax, height[ileft])
            irightMax = max(irightMax, height[iright])
            if height[ileft] < height[iright]:
                result += ileftMax - height[ileft]
                ileft += 1
            else:
                result += irightMax - height[iright]
                iright -= 1
        return result
        
    print(trapRainWater_ext3([0,1,0,2,1,0,1,3,2,1,2,1]))
    # 运行结果
    6
  2. 堆栈大法超越97%

    ​      堆栈是编译原理中最常见的数据结构,采用堆栈来读取数组,精准分析雨水槽位置和面积,形成了降维打击。此算法超越97%的通过者,可谓是堆栈一出,谁与争锋

    python 复制代码
    def trapRainWater_ext4(height):     # 使用堆栈计算雨水槽
        stackDef = []
        res = 0
        for iIdx in range(len(height)):
            while stackDef and height[iIdx] > height[stackDef[-1]]:
                cur = stackDef.pop()
                if not stackDef:
                    break
                iHeight = min(height[iIdx], height[stackDef[-1]]) - height[cur]
                iWidth = iIdx - stackDef[-1] - 1
                res += iHeight * iWidth
            stackDef.append(iIdx)
        return res
    
        
    print(trapRainWater_ext4([0,1,0,2,1,0,1,3,2,1,2,1]))
    # 运行结果
    6

    一日练,一日功,一日不练十日空

    may the odds be ever in your favor ~

相关推荐
代码雕刻家18 分钟前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain18 分钟前
算法 | 位运算(哈希思想)
算法
FreakStudio1 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
丶21361 小时前
【CUDA】【PyTorch】安装 PyTorch 与 CUDA 11.7 的详细步骤
人工智能·pytorch·python
Kalika0-02 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
_.Switch2 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一个闪现必杀技2 小时前
Python入门--函数
开发语言·python·青少年编程·pycharm
sp_fyf_20242 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
小鹿( ﹡ˆoˆ﹡ )2 小时前
探索IP协议的神秘面纱:Python中的网络通信
python·tcp/ip·php
卷心菜小温3 小时前
【BUG】P-tuningv2微调ChatGLM2-6B时所踩的坑
python·深度学习·语言模型·nlp·bug