LeetCode 42. Trapping Rain Water(Hard)

量化回测框架三选一:Backtrader、Zipline、PyAlgoTrade,新手到底该跟谁学? 本文对比分析了三大量化回测框架Backtrader、Zipline和PyAlgoTrade,帮助新手选择最适合的入门工具。从安装配置、策略编写到文档查阅,详细解析各框架的特点和适用场景,为量化交易初学者提供实用指南。 阅读详情

查看原文,请点击彼得.攀的小站
查阅更多的题解,请点击

Problem

42. Trapping Rain Water(Hard)

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6

Solution

该题很有意思,可以当作是在砌墙:输入一个数组,数组元素可以当作当前位置墙的高度,问该种情况,能装多少水(可以这么理解,不过实际上是2维平面,只考虑面积)

类似于“木桶效应”,能装多少水取决于最短的那块木板,即若3个即即以上连续的元素呈现V型,则可以“装水”,数量取决于两个“峰”中较少的那一个。

先分享一个错误的想法:

可以通过一次遍历找到所有可以“装水”的gap,然后去计算。但是这里存在一个问题:[3,1,2,1,6](gap为[3,1,2]和[2,1,6])和[5,2,1,2,1,5](gap为[5,2,1,2]和[2,1,5)这样的输入,我需要去合并多个gap,分情况讨论时比较复杂,并不可取

Two Pointers
O(n) time, O(1) space

为了得到结果,显然知道问题的全部信息而非局部信息,即需要遍历整个输入数组。通常的数据遍历一个指针从前向后或是从后向前遍历,不妨设从前向后遍历,当前已遍历到第i个元素,前i个元素的最大值为max,下标为k(k<i):那么很直观地想到,对于第i个位置,能装的水是否为max-height[i-1]?

很遗憾不能,由于能装的水取决于木桶的短板,max只是单侧桶壁,若其比另一侧的桶壁短,则计算正确。

那么不妨用两个指针进行遍历,一个从前向后,一个从后向前,并记录maxLeft,maxRight,那么若maxLeft<maxRight,则在左边计算,反之在右边计算。

Stack
O(n) time, O(n) space

考虑之前失败的idea,问题在于某些gap需要merge,比如:输入为[3,1,2,1,6],两个gap为[3,1,2]和[2,1,6],需要merge,这时可以有一个smart的merge方式:
如下图所示,黑色部分为高度,灰色和绿色部分之和为所求结果,我们可以先求灰色部分,再求绿色部分,该过程可以用栈实现

GitHub传送门-solution one
GitHub传送门-solution two

Solution One
class Solution
{
  public:
    int trap(vector<int> &height)
    {
        int n = height.size();
        if (n < 3)
            return 0;
        int ret = 0;
        int left = 0, right = n - 1;
        int maxLeft = 0, maxRight = 0;
        while(left<right){
            if(height[left]<height[right]){
                if(height[left]>maxLeft)
                    maxLeft = height[left];
                else
                    ret += maxLeft - height[left];
                left++;
            }else{
                if(height[right]>maxRight)
                    maxRight = height[right];
                else
                    ret += maxRight - height[right];
                right--;
            }
        }
        return ret;
    }
};
Solution Two
class Solution
{
  public:
    int trap(vector<int> &height)
    {
        int n = height.size();
        if (n < 3)
            return 0;
        int ret = 0;
        stack<int> s;
        for (int i = 0; i < n; ++i)
        {
            while (!s.empty() && height[i] > height[s.top()])
            {
                int low = height[s.top()];
                s.pop();
                if (!s.empty())
                {
                    int width = i - s.top() - 1;
                    int h = min(height[i], height[s.top()]) - low;
                    ret += width * h;
                }
            }
            s.push(i);
        }
        return ret;
    }
};
机器人控制算法九之 位姿描述与空间变换 阅读详情

相关推荐

MT5策略如何设置回测结果才能最接近实盘

摘要:在MT5回测中,选择"每笔分笔报价"模式最接近实盘交易,因其使用真实Tick数据模拟价格波动、点差和滑点。关键设置包括:下载高质量历史数据、合理设定点差和滑点、使用正常回测速度。该模式能准确测试挂单、止盈止损等策略,虽然速度较慢但结果最可靠,避免其他模式造成的失真,是评估交易策略表现的最佳选择。(149字)

weixin_38915451的博客 1877

力扣第42题:接雨水——单调栈

LeetCode第42题 接雨水 单调栈

qq_43903506的博客 3995

thinkcmf 代码执行 (CVE-2019-7580) 漏洞复现

所有文章,仅供安全研究与学习之用,后果自负! thinkcmf 代码执行 CVE-2019-7580thinkcmf 代码执行 (CVE-2019-7580)0x01 漏洞描述0x02 影响范围0x03 漏洞复现3.1 登录后台3.2 漏洞利用3.2.1webshell3.2 phpinfo3.3 获取系统命令0x04 漏洞修复 thinkcmf 代码执行 (CVE-2019-7580) 复现小心会搞崩环境。 0x01 漏洞描述 ThinkCMF是一款支持Swoole的开源内容管理框架(CMF),基于Thi

YouthBelief的博客 4264

leetcode精选高频hard题目

leetcode精选高频hard题目 4.寻找两个正序数组的中位数 60.排列序列 37.解数独 51.N皇后 52.N皇后2 149.直线上最多的点数 42.接雨水 135.分发糖果 41.缺失的第一个正数 25.K个一组翻转链表 65.有效数字 28.实现strStr() 132.分割回文串2 44.通配符匹配 10.正则表达式匹配 97.交错字符串 72.编辑距离 32.最长的有效括号 84.柱状图中最大的矩形 85.最大矩阵 239. 滑动窗口最大值 99.恢复二叉搜索树 124.二叉树中的最大.

Worthy_Wang的博客 5863

Ubuntu服务器通过IPV6端口转发搭建幻兽帕鲁私服实战

本文详细介绍了在Ubuntu服务器上通过IPV6端口转发搭建幻兽帕鲁私服的完整教程。针对只有公网IPV6地址的服务器环境,提供了从硬件检查、端口转发工具配置到游戏服务器安装的全流程解决方案,帮助玩家轻松实现多人联机游戏体验。

weixin_30652491的博客 490

华为OD机试真题 新系统2026-04-15 C++ 实现【失灵的键盘】

有一个键盘有2个按键失灵了,按下这些键时会连续输出其他键对应的字符两次。具体如下: 1. 按下j键一次,屏幕上显示uu(两个连续的u);  按下b键一次,屏幕上显示t(两个连续的t) 2. u键和t键是好的,按下u键一次时,屏幕只会显示一次u(正常按键);按下t键一次时,屏幕只会显示一次t(正常按键) 3. 假定屏幕上连续显示两个t一定是按了一次b键,而不是两次t键;假定按键t之后不会紧接着按键b,即tttt转义为两个b,而不可能是tb

MISAYAONE的博客 211

42. 接雨水(C++) --- 单调递减栈解题

给定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 个单位的雨水(蓝色部分表示雨水)。 示例 2: 输入:height = [4,2,0,3,2,5] 输出:9 提示: n == height.length 0 <= n &l...

努力学习的DS 557

第14.1章 高翔博士2025年11月最新开源框架Lightning-LM源码学习解读(一):激光-IMU定位+建图算法各模块简介

Lightning-LM:高效激光SLAM定位系统 该框架基于模块化设计,通过激光-IMU融合实现快速建图与定位,核心特点包括: 极速性能:纯CPU运行(建图1.2核/定位0.8核) 模块化架构:包含激光里程计(LIO)、地图管理、回环检测等独立模块 动态场景支持:地图分块加载、动静态图层分离 多模式适配:支持ROS2环境下的在线/离线运行 关键模块包括前端里程计(core/lio)、2D/3D地图转换(core/g2p5)、轻量优化库(core/miao)等,通过系统控制器(core/system)协调流

行知SLAM 2438

Leetcode 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 解题思路 我们首先想到的做法就...

coordinate的博客 2万+

06 - 深度学习处理器原理

深度学习处理器的重要性在于它们可以加速深度学习任务的执行,从而推动了人工智能的发展。传统的通用处理器虽然可以执行深度学习任务,但它们不够高效,需要消耗大量的能量和时间。深度学习处理器通过硬件加速和特定设计来优化深度学习任务的执行,从而可以提高执行效率、降低能耗和加速训练和推断过程。 深度学习处理器的发展也推动了深度学习算法的创新,因为算法的发展需要硬件的支持和驱动。同时,深度学习处理器的出现也促进了更广泛的应用场景,包括自动驾驶、人脸识别、语音识别、图像识别等领域。因此,深度学习处理器的重要性不仅在于加速

m0_51339444的博客 752

PCL 基于法向距离的对应点获取

提出了一种基于法向量欧氏距离的点云配准方法。详细推导了法向量距离计算公式,并给出具体计算流程。在代码实现部分,采用PCL库完成了点云法向量计算和对应关系估计,通过可视化验证了算法有效性。实验结果表明,该方法能够准确获取点云间的对应关系,为后续点云配准奠定了基础。

点云侠的博客 226

【LeetCode力扣】42. 接雨水

42. 接雨水 - 力扣(LeetCode)leftMax用于记录当前左指针left经过的最大高度,同理rightMax用于记录当前左指针right经过的最大高度。下标 i 处能否接水以及接到水的数量其实取决于左指针left到 i 时所经过的最大高度leftMax与右指针right到 i 时所经过的最大高度rightMax它们之间的较小值。

Hacynn的博客 2757

大模型复杂问答能力评测框架:从原理到实践

在人工智能领域,大语言模型(LLM)的评估是衡量其实际应用价值的关键环节。其核心原理在于通过系统化的评测框架,对模型的理解、推理、整合与表达能力进行量化分析。传统的NLP基准测试往往侧重于事实性检索或简单推理,难以全面反映模型在应对多跳推理、隐含条件、长上下文整合等复杂现实任务时的真实性能。因此,专门针对复杂问答设计的评测技术应运而生,其价值在于为模型选型、效果优化和瓶颈诊断提供数据驱动的科学依据。该技术广泛应用于需要深度逻辑判断的业务场景,如智能投顾、法律咨询、医疗诊断等。本文聚焦的`tan92hl/Co

weixin_28679635的博客 362

Leetcode 42. Trapping Rain Water (Hard) (cpp)

Leetcode 42. Trapping Rain Water (Hard) (cpp)

还是需要多学习!闷声大发财,这是坠吼的! 543

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【leetcode】【hard】【每日一题】42. Trapping Rain Water​​​​​​​

42. Trapping Rain Water Givennnon-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. The above elevation ma...

lemonade13的博客 133

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

[Leetcode 42, Hard] Trapping Rain Water

[Leetcode 42, Hard] Trapping Rain Water

算法的实践 488

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode 42. Trapping Rain Water(Hard)

LeetCode 42. Trapping Rain Water Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. The above el...

Curiouszhou's Blog 167

Leetcode 42. Trapping Rain Water [hard][java]

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. Solution 1

inkhk的博客 197

LeetCode | 42. Trapping Rain Water (Hard)

题外话: 前50为数不多剩下的题目,前段时间AC了~终于哈哈哈 题目: Givennnon-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. Th...

iLOVEJohnny的博客 204

LeetCode Top 100 Liked Questions 42. Trapping Rain Water (Java版; Hard)

welcome to my blog LeetCode Top 100 Liked Questions 42. Trapping Rain Water (Java版; Hard) 题目描述 Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how...

littlehaes的博客 179

LeetCode 42. Trapping Rain Water (Hard)

Description: Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining. The above elevation map is represen...

weixin_45744426的博客 200

【LeetCode】 42. Trapping Rain Water 接雨水(Hard)(JAVA)

【LeetCode】 42. Trapping Rain Water 接雨水(Hard)(JAVA) 题目地址: https://leetcode.com/problems/trapping-rain-water/ 题目描述: Given n non-negative integers representing an elevation map where the width of each ba...

qq_16927853的博客 195

[leetcode 42. Trapping Rain Water] Hard | Week 1

Trapping Rain Water一、题目Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.For example, Given [0,1,0,

huanghaodong1997的博客 238

leetcode 42. Trapping Rain Water (hard)

找出最高的柱子,分别计算其两边的柱子 对左边的每个点而言 其左边最大柱子的高度 - 其本身的高度 = 这一点能容纳的水量 右边同理 class Solution { public: int trap(vector<int> &height) { int partionPeak = 0; int sumWater = 0; // 分界点 for (int...

Rh's blog 163

Leetcode - 42 - Trapping Rain Water (hard)

Givennnon-negative integers representing an elevation map where the width of each bar is1, compute how much water it can trap after raining. Solutions: ans = sum {min⁡(left_max,right_max)−height[i]min(left_max,right_max)−height[i] for all element...

xin_rong的博客 205

LeetCode [One hard A Day] - 42. Trapping Rain Water

Trapping Rain Water 对于array里的每一个位置来说,它的积水量 = min(左边最高的墙, 右边最高的墙) —自己位置的高度。[哭了,我连这个都不知道,感觉输在起跑线上了] 总结,这道题其实就是寻找每个位置的基准:min(左边最高的墙, 右边最高的墙) <——重点在于如何寻找基准 [min of two side max]自高:自己位置的高度 Brute Fo...

real_lisa的博客 275
上一篇: LeetCode 73. Set Matrix Zeroes(Medium)
下一篇: LeetCode 380. Insert Delete GetRandom O(1)(Medium)
彼得.攀
博客等级 码龄11年 11粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值