力扣42.接雨水-python解法总结

【算法】经典算法题:接雨水 I & II(Python实现) 一、接雨水 I leetcode.42 链接:https://leetcode.cn/problems/trapping-rain-water/ 难度:hard 这里介绍了两种方法:动态规划(时间和空间复杂度都为O(n)),双指针(时间复杂度O(n),空间复杂度O(1))。 1、动态规划 时间复杂度:O(n) 空间复杂度:O(n) (1)算法原理 首先,维护两个数组: leftMax:第i个元素表示第i个柱子及左边位置中,height的最大高度。 righ... 阅读详情

解法一:暴力无脑解题法(超时)

对每一个格子进行推算,根据左右最高的格子数来计算能接水的单位数,最后逐一相加

class Solution:
    def trap(self, height: List[int]) -> int:
        ans = 0
        for i in range(len(height)):
            max_left, max_right = 0,0
            # 寻找 max_left
            for j in range(0,i):
                max_left = max(max_left,height[j])
            # 寻找 max_right
            for j in range(i,len(height)):
                max_right = max(max_right,height[j])
            if min(max_left,max_right) > height[i]:
                ans += min(max_left,max_right) - height[i]    
        return ans

解法二:动态规划

在暴力解题的基础上,使用数组来放置maxleft和maxright,降低时间复杂度,遍历次数大大减少

class Solution:
    def trap(self, height: List[int]) -> int:
        # 边界条件
        if not height: return 0
        n = len(height)
        maxleft = [0] * n
        maxright = [0] * n
        ans = 0
        # 初始化
        maxleft[0] = height[0]
        maxright[n-1] = height[n-1]
        # 设置备忘录,分别存储左边和右边最高的柱子高度
        for i in range(1,n):
            maxleft[i] = max(height[i],maxleft[i-1])
        for j in range(n-2,-1,-1):
            maxright[j] = max(height[j],maxright[j+1])
        # 一趟遍历,比较每个位置可以存储多少水
        for i in range(n):
            if min(maxleft[i],maxright[i]) > height[i]:
                ans += min(maxleft[i],maxright[i]) - height[i]
        return ans

解法三:分层+双指针

接完雨水后的图形,看起来会有很明显的特点,从前后分别往中间靠,一定是递增的,一直到最高点

所以分设两个指针left,right,从前后分别向中间移动,在遇到较之前大的数字后停下,两个指针进行计算right-left+1得出这一层的单元块有多少个,然后将每一层的块数加起来,就是接水后的块数,再减去输入的块数,就是雨水的单位数,图解如下

class Solution:
    def trap(self, height: List[int]) -> int:
        n=len(height)
        left,right=0,n-1
        SUM,tmp,high=0,0,1
        while(left<=right):
            while(left<=right and height[left]<high):
                SUM+=height[left]
                left+=1
            while(right>=left and height[right]<high):
                SUM+=height[right]
                right-=1   
            high+=1
            tmp+=right-left+1      
        return tmp-SUM

解法四:双指针+几何法

另外解法三也可以改进一下,因为你会发现,如果两个指针相对移动的同时,分别记录遇到的最大值,然后每一轮都将他们的值相加,最后的结果会是以max(list)和len(list)为边长的矩形格子数加上接雨水后的图形,看下图

红线和黄线分别是left和right指针移动路线的值

class Solution:
    def trap(self, height: List[int]) -> int:
        lmax, rmax, res = 0, 0, 0
        for i in range(len(height)):
            lmax = max(lmax, height[i])
            rmax = max(rmax, height[-1-i])
            res += lmax + rmax - height[i]
        return res - lmax * len(height)

解法五:几何法

如图分成四个块,要求的是灰色部分的单位块数,由大矩形块数减去黑色部分也就是输入的列表的求和,再减去红色和淡蓝色的部分,这两部分分别是从前和后向中间遍历到最高点,记录最大值与最高点的差值

class Solution:
    def trap(self, height: List[int]) -> int:
        if not height: return 0
        max_h = max(height)
        rain = max_h * len(height) - sum(height)
        m_h = 0
        for h in height:
            if h >= max_h: break
            if h > m_h: m_h = h
            rain -= max_h - m_h
        m_h = 0
        for h in reversed(height):
            if h >= max_h: break
            if h > m_h: m_h = h
            rain -= max_h - m_h
        return rain

!!!本文参考了力扣大神的解法,特此说明!!!

LeetCode题解-接雨水Python实现 LeetCode题解-接雨水Pythonyuyan语言实现,三种解法,想你所想 阅读详情

相关推荐

Python实现3D接雨水

鱼弦:优快云内容合伙人、优快云新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)例如,在城市设计中,可以利用该算法评估建筑物和道路的排水系统,确定最佳的雨水收集策略。该算法的原理是通过遍历边界上的点,并使用优先队列(堆)来选择最低的点进行扩展。该算法基于优先队列(堆)的思想,通过从边界点开始,不断选择最低的点并向内部扩展,计算接到的雨水量。

走向CTO的路上... 716

接雨水 四种解法(Python)

单调栈 时间复杂度O(N) class Solution: def trap(self, height: List[int]) -> int: indexStack = [] sum = 0 for i in range(len(height)): while indexStack and height[i] > height[indexStack[-1]]: bottom = in

You can either travel or read,but either your body or soul must be on the way. 1637

leetcode:42.接雨水

来源:力扣(LeetCode)链接: https://leetcode.cn/problems/trapping-rain-water给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例 1: 示例 2: 提示:暴力算法:左右两边高度的最小值, 动态规划:单调栈:双指针:使用列表自带的性质; python实现 使用front rear双指针,并将容量扩从为k+1 c++实现 复杂度分析python实现 c++实现 复杂度分析......

uncle_ll的博客 529

15. 接雨水_Python算法

解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。#水的面积 = h1累加的面积 + h2累加的面积 - 整个框的面积 - 黑色物体的面积。输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输入:height = [4,2,0,3,2,5]# 定义解题方法:通过画图求水面积。

shengfuok123456的博客 471

用Arduino+ESP32复现TDOA定位:低成本实现厘米级精度的完整教程

本文提供了一套利用Arduino和ESP32平台,结合NRF24L01+模块与GPS/PPS时间同步方案,低成本复现高精度TDOA(到达时间差)定位系统的完整教程。教程详细阐述了从硬件选型、天线阵列设计、时间同步实现到核心算法与多径抑制的实战步骤,旨在帮助开发者和硬件爱好者以可控成本实现厘米级精度的定位演示系统。

weixin_29084111的博客 162

MacBook 上 LaTeX 环境搭建:从 Mactex 到 Sublime Text 与 Skim 的保姆级配置流程

本文详细介绍了在MacBook上搭建LaTeX环境的完整流程,从Mactex安装到Sublime Text与Skim的配置优化。涵盖基础环境准备、编辑器设置、PDF预览同步等关键步骤,帮助用户快速建立高效的LaTeX工作流,特别适合学术写作和技术文档创作。

weixin_30824599的博客 681

LeetCode刷题(python版)——Topic42接雨水

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

weixin_54039182的博客 1577

别再只会用官网例子了!Vxe-Table过滤功能深度自定义:从下拉框到服务端筛选的完整配置流程

本文深入解析Vxe-Table表格组件的过滤功能,从基础UI定制到服务端筛选的完整实现流程。通过实战案例演示如何超越官方示例,实现下拉框、日期范围等复杂过滤交互,并详细讲解混合过滤策略与性能优化技巧,帮助开发者应对大数据量场景下的表格筛选需求。

weixin_42526353的博客 205

LeetCode 42接雨水问题:从暴力到双指针的5种解法全解析(Python/Java/C++实现)

本文深入解析LeetCode 42接雨水问题的五种核心解法,涵盖从暴力法、动态规划到最优的双指针法,并拓展至三维变种(LeetCode 407)。详细剖析了每种算法的思路、时间/空间复杂度及面试考察点,并提供Python、Java、C++多语言实现,帮助读者全面掌握这一经典算法面试题。

yhn456789的博客 690

基于树莓派5的AR头显开发:从硬件选型到Unity整合全解析

增强现实(AR)技术通过将虚拟信息叠加到真实世界,为用户提供沉浸式交互体验。其核心原理依赖于计算机视觉进行环境感知与空间定位,并结合实时3D渲染实现虚实融合。在工程实践中,嵌入式平台因其低成本、低功耗特性,成为探索AR应用边界的重要载体。本项目以树莓派5为核心,通过集成OpenCV进行ArUco标记识别实现精准空间定位,并利用MediaPipe完成手势交互,最终在Unity引擎中完成虚实场景的实时渲染与融合,为开发者提供了一个完整的、可亲手实践的AR系统开发方案。

weixin_32430941的博客 254

华为OD面试八股文嵌入式C语言基础问题及答案(一)

本文总结了C语言编程中的10个关键知识点:1.宏定义MIN的实现方法;2.嵌入式无限循环的两种写法;3.变量a的8种不同定义方式;4.static关键字的三种作用;5.const关键字的含义和使用场景;6.volatile关键字的含义及三个应用实例;7.变量存储位置(栈区、静态区、堆区);8.32位系统指针位数;9.局部与全局变量重名规则;10.引用与指针的三点区别。这些内容涵盖了宏定义、变量声明、存储类别、指针等C语言核心概念,对嵌入式开发和系统编程具有重要参考价值。

m0_50382756的博客 160

LeetCode 42接雨水问题:从暴力到双指针的5种解法对比(附Python/Java/C++代码)

本文深入解析LeetCode 42接雨水问题的5种解法,从暴力法到双指针优化,详细对比各解法的时间与空间复杂度。通过Python/Java/C++多语言实现,帮助开发者掌握算法优化技巧,特别适合准备大厂面试的编程爱好者。

zz67890的博客 711

用ChatGPT 5.5掌握SCI的4个实操润色技巧,论文质量极速提升!(附提示词)

ChatGPT 5.5的发布,在学术写作中的应用变得更加精准和安全,通过正确的使用方法,不仅可以改善语法与表达,让论文达到SCI发表水准,还能最大程度保留作者原意,将AIGC检测率控制在低风险区间。可以帮大家省下大量纠结语法、梳理逻辑的时间,在保证润色质量的同时,兼顾AIGC检测的合规要求,为论文投稿成功率提供实实在在的提升。通过智能调整语序、优化用词和句式结构,该方法能够在保留学术质感的同时,使文章表达更自然、贴近人工撰写的风格,从而避免文字过于程式化,提升论文整体可读性和表达的个性化特征。

智能AI让学术科研更容易 64

Leetcode Hot100之六:42.接雨水的python和java解法(预处理双数组+单调栈)

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

shanshan的博客 705

《Zephyr OS 入门与实战》第15章:LoRaWAN 集成

【代码】《Zephyr OS 入门与实战》第15章:LoRaWAN 集成。

2301_79143213的博客 610

ROS与Qt5人机交互界面开发:添加rviz显示界面

最后,点击"完成"以创建新的Qt5应用程序项目。通过结合ROS和Qt5,您可以创建强大的人机交互界面,以实现丰富的机器人控制和数据可视化。在本教程中,我们将在主窗口中创建一个简单的按钮,用于启动rviz显示界面。在Qt Creator的槽函数编辑器中,为按钮添加一个槽函数,该函数将在单击按钮时调用。在上面的代码中,我们使用QProcess类启动了一个新的进程,并执行"rviz"命令来启动rviz显示界面。当您单击Qt5应用程序中的按钮时,将会启动一个新的rviz窗口,显示机器人数据的可视化界面。

CodeJolt的博客 2067

Leetcode 42 接雨水

接雨水 困难题,有多种解法,比如:单调栈,动态规划,双指针。

qq_43456497的博客 123

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

力扣(42):接雨水(python)

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

2503_91125378的博客 391

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Leetcode 42. 接雨水 双指针/动态规划 C++ / Python / Java

本文介绍了Leetcode 42题"接雨水"的四种解法。暴力解法通过双重循环计算每个位置的左右最大值,但会超时;优化解法使用数组存储左右最大值,空间换时间;双指针法在O(1)空间内完成计算,通过比较左右最大值决定移动方向;栈解法利用单调栈结构计算积水区域。四种方法逐步优化,从O(n²)到O(n)时间复杂度,展示了不同思路下的解题策略。其中双指针法最为高效,只需一次遍历即可得出结果。

想买很多漂亮衣服但是买不起的博客 571

Leetcode 42.接雨水(Trapping Rain Water)

Leetcode 42.接雨水 1 题目描述(Leetcode题目链接)   给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [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 2 ...

qq_39378221的博客 180

【Golang】LeetCode 42. 接雨水

基于 Golang 和 Python 解决 LeetCode 42. 接雨水。使用两个一维数组对当前位置两侧的最大高度进行统计即可解决问题。

YGGP的博客 157

接雨水-双指针42-python&c++

python class Solution: def trap(self, height: List[int]): left, right = 0, len(height) - 1 leftmax, rightmax = height[left], height[right] res = 0 while left != right: if height[left] >= leftmax:

VaccyZhu的博客 209

力扣hot100_双指针_python版本

【代码】力扣hot100_双指针_python版本。

Y1n的博客 293

【leetcode-Python】-Dynamic Programming-42. Trapping Rain Water

题目链接 https://leetcode.com/problems/trapping-rain-water/ 题目描述 给定n个非负整数组成的数组表示宽度为1的各个柱子的高度,计算柱子按照数组顺序排列后能够接多少雨水。 示例 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解析: ...

gulaixiangjuejue的博客 284

LeetCode 42. 接雨水 Python实现5种算法

42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 动态规划(开始想到的)(O(n^2)) class Solution: def trap(self, height: List[i

buglesxu的博客 1413

leetcodehot100双指针

slow 指针记录下一个非 0 存放位置;fast 遍历数组,遇到非 0 就交换 slow 和 fast,slow++。:高度数组,选两根竖线,求最大盛水面积。移动长边,宽度减小,高度上限不变,面积不可能更大。:原地把数组所有 0 移到末尾,非 0 保持相对顺序。:数组找出所有不重复三元组,三数之和 = 0。复杂度:O (n²),排序 O (nlogn),哪边 max 小,就结算哪边的水量。复杂度:O (n),原地 O (1)复杂度:O (n),O (1) 空间。:柱子高度,求下雨能接多少雨水。

2403_88152589的博客 157
上一篇: 用python来解PAT乙级1011A+B和C-15-满分
下一篇: 用python来解PAT乙级1054求平均值-20-满分
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值