Leetcode42. 接雨水

Leetcode 42:JavaScript解力扣接雨水算法详细到每一行注释 一 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 一眼看到这题,要左右左右对比计算好烦,于是立刻想到一层一层计算的方法,但是使用递归的话会爆栈啊??不管了————谁叫我像风一样自由~ 就像你的温柔 ~ ... 阅读详情

Every day a Leetcode

题目来源:42. 接雨水

解法1:前后缀分解

pre_max[i] 表示从 height[0] 到 height[i] 的最大值,suf_max[i] 表示从 height[i] 到 height[n-1] 的最大值。

将接雨水视为一个个底边长度为 1 的水桶,桶的高度是 min(pre_max[i], suf_max[i]) - height[i],水桶的宽度为 1,接水量为两者的乘积。

代码:

/*
 * @lc app=leetcode.cn id=42 lang=cpp
 *
 * [42] 接雨水
 */

// @lc code=start

// 前后缀分解

class Solution
{
public:
    int trap(vector<int> &height)
    {
        int n = height.size();
        // pre_max[i] 表示从 height[0] 到 height[i] 的最大值
        vector<int> pre_max(n);
        pre_max[0] = height[0];
        for (int i = 1; i < n; i++)
            pre_max[i] = max(pre_max[i - 1], height[i]);
        // suf_max[i] 表示从 height[i] 到 height[n-1] 的最大值
        vector<int> suf_max(n);
        suf_max[n - 1] = height[n - 1];
        for (int i = n - 2; i >= 0; i--)
            suf_max[i] = max(suf_max[i + 1], height[i]);

        // 将接雨水视为一个个底边长度为 1 的水桶,
        // 水桶的高度是 min(pre_max[i], suf_max[i]) - height[i]
        // 水桶的宽度为 1,接水量为两者的乘积
        int sum = 0;
        for (int i = 0; i < n; i++)
            sum += min(pre_max[i], suf_max[i]) - height[i];
        return sum;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 height 的元素个数。

空间复杂度:O(n),其中 n 是数组 height 的元素个数。

解法2:相向双指针

本质上还是前后缀,但是不需要求出前后缀最大值数组,而是在双指针遍历过程中维护前缀最大值和后缀最大值,并计算当前水桶的接水量。

接水量的总和即为答案。

代码:

// 相向双指针

class Solution
{
public:
    int trap(vector<int> &height)
    {
        int n = height.size();
        int left = 0, right = n - 1;
        // pre_max 表示前缀最大值,suf_max 表示后缀最大值
        int pre_max = 0, suf_max = 0;
        int sum = 0;

        while (left < right)
        {
            // 更新前后缀最大值
            pre_max = max(pre_max, height[left]);
            suf_max = max(suf_max, height[right]);
            if (pre_max < suf_max)
            {
                sum += pre_max - height[left];
                left++;
            }
            else
            {
                sum += suf_max - height[right];
                right--;
            }
        }

        return sum;
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 height 的元素个数。

空间复杂度:O(1)。

解法3:单调栈

上面的方法相当于「竖着」计算面积,单调栈的做法相当于「横着」计算面积。

这个方法可以总结成 16 个字:找上一个更大元素,在找的过程中填坑。

注意 while 中加了等号,这可以让栈中没有重复元素,从而在有很多重复元素的情况下,使用更少的空间。

代码:

// 单调栈

class Solution
{
public:
    int trap(vector<int> &height)
    {
        int ans = 0;
        stack<int> st;
        for (int i = 0; i < height.size(); i++)
        {
            while (!st.empty() && height[i] >= height[st.top()])
            {
                int bottom_h = height[st.top()];
                st.pop();
                if (st.empty())
                    break;
                int left = st.top();
                // 面积的高和宽
                int dh = min(height[left], height[i]) - bottom_h;
                int dw = i - left - 1;
                ans += dh * dw;
            }
            st.push(i);
        }
        return ans;
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(n),其中 n 是数组 height 的元素个数。

空间复杂度:O(min(n,U)),其中 U=max(height)−min(height)+1。注意栈中没有重复元素,在 height 值域很小的情况下,空间复杂度主要取决于 height 的值域范围。

LeetCode 42.接雨水 给定一个包含非负整数的数组height,每个元素表示一个柱子的高度。每个柱子宽度为 1,计算按此排列的柱子,下雨之后能接多少雨水。i。 阅读详情

相关推荐

【困难】力扣算法题解析LeetCode42:接雨水

本文介绍了如何计算柱状图中的雨水积累量。通过双指针法,动态维护左右两侧的最大高度,每次移动较小高度侧的指针来计算当前位置的积水量。时间复杂度为O(n),空间复杂度为O(1)。该方法高效地解决了问题,适用于大规模数据。

ylumwd的博客 425

【LeetCode】42. 接雨水

42. 接雨水(二维) 一、题目描述 给定 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.1 按列求 求每一列的水,我们只需要关注当前列,以及左边最高的墙,右边最高的墙就够了。 装水的多少,当然根据木

weixin_41888257的博客 1281

python【力扣LeetCode算法题库】42-接雨水(双指针法)

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 如果maxleft<m...

NJU phd 在读。 906

Leecode42——接雨水

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

qq_53507133的博客 2056

jaka+realsense+aruco+手眼标定(python)

第二次重建了项目的手眼标定部分……有很多第一次记录遗漏的地方,在此补充。

drivenzyw的博客 2122

Windows Server双机热备实战:用IIS+ARR+NLB搭建高可用Web服务(附避坑指南)

本文详细介绍了在Windows Server环境下,利用IIS、ARR(Application Request Routing)和NLB(Network Load Balancing)构建高可用Web服务的实战方案。通过双机热备架构,实现从网络层到应用层的全面冗余与智能流量分发,并提供了关键的配置步骤、常见避坑指南及性能调优建议,确保企业级Web服务的连续性与可靠性。

weixin_29210759的博客 383

leetcode---42.接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水) 解题思路: 黑色看成墙,宽度为1,给定数组,每个数代表从左到右墙的高度,雨滴的个数其实就是上图蓝色正方形的个数。 解法一:按行求 开始的想法比较暴力且...

litt1e的博客 818

卡方分布的前世今生:一个统计概念的演化史

本文追溯了卡方分布从19世纪末的理论雏形到现代统计推断核心工具的发展历程。从Karl Pearson的数学奠基到Ronald Fisher的理论完善,卡方分布在医学研究、社会科学和机器学习等领域展现出广泛应用。文章通过代码示例和性质分析,揭示了这一统计概念如何持续推动数据科学创新。

weixin_29251567的博客 390

【LeetCode力扣】42. 接雨水

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

Hacynn的博客 2757

CCC数字钥匙Release 3实战:如何用BLE/UWB实现无钥匙进入(附避坑指南)

本文深入解析CCC数字钥匙Release 3标准下BLE/UWB无钥匙进入系统的开发实践,涵盖硬件选型、安全测距协议、时序同步等关键环节,并提供实战调试技巧与安全攻防案例。特别针对BLE芯片配置、UWB模块选型等常见陷阱给出解决方案,帮助开发者高效实现厘米级精度的数字钥匙系统。

weixin_29326909的博客 254

在C++中,NULL和nullptr有什么区别?

这两个定义导致了冲突,C++中的NULL如果和C语言一样也是(void *)0指针,而C++不允许void*隐式转换成其它指针类型,那NULL就无法表示空指针了。因此,使用 nullptr可以增加代码的清晰性,避免类型安全问题。即使在混合C++和C代码时,nullptr也提供了一个明确无误的空指针表示,达到兼容的目的。C++11 引入 nullptr 彻底解决了这些问题,提高语言的安全性、清晰性和现代性。在了解NULL和nullptr背后的故事之后,相信大家以后再也不会用NULL了。

hebhljdx的博客 678

[H单调栈] lc42. 接雨水(单调栈+前后缀分解+双指针+经典)

文章目录1. 题目来源2. 题目解析 1. 题目来源 链接:42. 接雨水 2. 题目解析 是一个单调栈的应用,本题对于计算面积的划分很有意思。当前栈顶和上一个栈顶的高度差作为雨水的高度,宽度就直接是下标之差。 如果最后单调栈不空,说明针对当前柱子来讲,其左边还有更高的柱子,比如柱子 4 一直将柱子 3 2 出栈,求得了红 3 的面积,但是上面的绿色面积需要配合柱子 1 来求。显然柱子 4 没有柱子 1 高,它进不去 while 循环,则需要在 while 循环外进行判断。即若栈非空,说明栈中元素比当前柱

Y-puyu 的博客 409

EMC工程师职业发展:从测试整改到系统设计的进阶之路

电磁兼容(EMC)是确保电子设备在复杂电磁环境中可靠工作的关键技术,其核心在于控制电磁干扰(EMI)并提升抗扰度。其基本原理涉及电磁场理论、噪声耦合路径与滤波屏蔽技术。对于电子产品而言,EMC设计直接关系到能否通过CE、FCC等强制性认证,是产品上市和市场竞争力的关键。在工程实践中,EMC工程师需要从电路设计、PCB布局、元器件选型等源头入手,将EMC要求融入产品开发全流程,实现从后期“整改”到前期“设计预防”的价值跃迁。本文聚焦EMC工程师的核心能力体系构建与职业发展路径,深入探讨了如何从掌握标准测试、电

weixin_30819085的博客 388

【LeetCode力扣】42.接雨水(困难)

一个用木板围成的桶能装多少水取决于最短的那块木板,同理,这道题我们可以把它看做成是由若干块木板组成的一个桶,只是它们是以并排的方式组成的,这里我用left和right两个指针分别指向最左和最右的两块木板,用变量 sum 来记录总的装水量以及两个变量 leftMax和rightMax来记录左边最高的木板值和右边最高的木板值

m0_65277261的博客 1213

创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—ISP图像处理开发案例

创龙科技研发的 TL3588-EVM 评估板具备强大视频处理能力,可满足多场景视频开发需求。为助力开发者快速上手,本文整理 7 个实用视频开发案例,涵盖从采集到显示的全流程,详细说明各案例的硬件连接、参数配置与代码解析,帮助开发者高效实现评估板视频相关功能开发与调试。

创龙,嵌入式一体化解决方案商 207

电磁场仿真软件:Sonnet_(12).Sonnet与其他软件的集成

Sonnet作为电磁场仿真领域的强大工具,不仅能够独立完成复杂的仿真任务,还可以通过与其他软件的集成,实现更高效的工作流程和更广泛的功能扩展。通过与CAD、EDA、数据处理软件、MATLAB、Python以及云计算平台的集成,Sonnet用户可以更好地利用现有设计资源,进行参数优化和结果分析,从而提升设计和仿真效率。希望本节的内容能够帮助你更好地理解和应用Sonnet的集成功能。

kkchenjj的博客 1432

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

LeetCode第42题 接雨水 单调栈

qq_43903506的博客 3994

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

力扣(leetcode) 42. 接雨水 (带你逐步思考)

难度:hard给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。主要需要实现快速对leftmax和rightmax的求解,这个十分简单,从左到右,从右到左各一次遍历就可以求出。将结果存放到数组里后续使用即可降低时间复杂度。这里由于需要保存rightmax,消耗了O(n)的内存,有没有更节省空间的方法?

龙卡的博客 888

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

NTscan扫描工具

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

力扣(LeetCode)100题:42.接雨水

本文介绍了LeetCode"接雨水"问题的三种解法。双指针解法通过左右指针从两边遍历,计算当前位置与左右最大高度差来累加雨水;动态规划解法预处理左右最大高度数组,用空间换时间将复杂度优化到O(n);单调栈方法利用递减栈结构实时计算低洼区域积水。三种方法各有特点,双指针空间最优(O(1)),动态规划思路直观(O(n)空间),单调栈则模拟了逐层积水的过程(O(n)空间)。

sweet_ran的博客 1097

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

力扣题解系列:42:接雨水

题目:42. 接雨水 题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。 来源:https://leetcode-cn.com/problems/trapping-rain-water/ 示例: 输入: [0,1,0,2,1,0,1,3,2,1,2,1] 输出: 6 思路

qq_38813052的博客 2179

LeetCode 力扣 42. 接雨水

题目描述(困难难度) 黑色的看成墙,蓝色的看成水,宽度一样,给定一个数组,每个数代表从左到右墙的高度,求出能装多少单位的水。也就是图中蓝色正方形的个数。 解法一 按行求 这是我最开始想到的一个解法,提交后直接 AC 了,自己都震惊了。就是先求高度为 1 的水,再求高度为 2 的水,再求高度为 3 的水。 整个思路就是,求第 i 层的水,遍历每个位置,如果当前的高度小于 i,并且两边有高度大于等于...

wind_liang的博客 1048

力扣第42题 接雨水

记录一下刷题历程 力扣第42题 接雨水。

buaichifanqie的博客 1527

LeetCode 每日一题 42. 接雨水 详细多种题解 C++描述

LeetCode 每日一题 42. 接雨水 详细多种题解 C++描述

一起加油 7520

力扣42.接雨水

对于每个一个位置。

Pisasama的博客 894

【算法入门】力扣题42:接雨水问题的Java与JavaScript解法|LeetCode 42. 接雨水:Java与JavaScript双解法详解|动态规划与双指针的艺术高效解法|

https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-100-liked给定 个非负整数表示每个宽度为 的柱子的高度图,计算下雨后这些柱子之间能接住多少雨水。示例 1: 示例 2: 提示: 方法二:双指针法 4. JavaScript 代码实现 方法一:动态规划法 方法二:双指针法 5. 复杂度分析 方法 时间复杂度 空间复杂度 适用场景 暴力法

南北极之间 1876

LeetCode 42接雨水

LeetCode 42接雨水 题目简述:给定 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 思路一:暴力解法 每个矩形条上方能接受水的高度,是由它左边最高的矩形,和右边最高的矩形决定的。因此需要从当前元素开始向左扫描并更新左边矩形最大值left_max = max(le

XBlog 252
上一篇: 华为机试真题练习汇总(91~100)
下一篇: C++ 智能指针
UestcXiye
博客等级 码龄8年 9028粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值