LeetCode 算法:接雨水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
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

题解

双指针法

  1. 题解:

LeetCode 上的“接雨水”问题是一个典型的双指针问题,它要求我们计算在给定的条形图中,能够接住的雨水量。
这个问题可以通过以下步骤解决:

  • 理解问题:首先,我们需要理解雨水是如何被接住的。雨水只能被两个更高的条形所夹住。因此,问题转化为找到所有可能的“容器”,这些容器的两侧条形的高度差即为能够接住的雨水量。

  • 初始化:我们需要两个指针,分别指向数组的两端,即 left 和 right。同时,我们需要两个变量来记录从 left 到 right 遍历过程中遇到的左侧和右侧的最大高度,即 leftMax 和 rightMax。

  • 遍历数组:使用一个循环,当 left 小于 right 时,执行以下操作:

    • 如果 height[left] 小于 height[right],则移动 left 指针。此时,左侧条形的高度决定了雨水的量。如果
      height[left] 小于 leftMax,则更新 leftMax。
    • 如果 height[left] 大于或等于 leftMax,则当前位置可以接住雨水,其量为 leftMax - height[left]。
    • 同理,如果 height[left] 大于 height[right],则移动 right 指针,并更新 rightMax。如果 height[right] 小于
      rightMax,则当前位置可以接住雨水,其量为 rightMax - height[right]。
  • 更新结果:在每一步中,如果当前位置可以接住雨水,则将计算出的雨水量累加到总结果 ans 中。

  • 继续移动:更新完当前位置的雨水量后,根据 height[left] 和 height[right] 的比较结果,移动 left 或
    right 指针,继续寻找下一个可以接住雨水的位置。

  • 结束循环:当 left 和 right 相遇时,循环结束。

  • 返回结果:返回计算出的总雨水量 ans。

  1. 复杂度:时间复杂度O(N),空间复杂度O(1)。
  2. 代码过程
  • trap 函数接受一个整数数组 height 作为输入,返回能够接住的雨水量。

  • 函数首先检查数组是否为空,如果是,则返回0。

  • 使用两个指针 left 和 right 分别从数组的两端开始向中间移动。

  • 使用两个变量 leftMax 和 rightMax 来记录从左到右和从右到左遍历时遇到的最大高度。

  • 在每一步中,比较 height[left] 和 height[right]:

    • 如果 height[left] 小于 height[right],则移动 left 指针,并且如果 height[left] 小于 leftMax,则更新 leftMax。
    • 否则,计算当前位置能够接住的雨水量,并累加到 ans。
    • 类似地,如果 height[left] 大于或等于 height[right],则移动 right 指针,并且更新 rightMax。
  • 重复上述步骤直到 left 和 right 相遇。

  • main 函数提供了两个示例数组 height1 和 height2,调用 trap 函数,并打印出能够接住的雨水量。

  1. c++ demo
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 函数用于计算接雨水的量
int trap(vector<int>& height) {
    int n = height.size();
    if (n == 0) return 0;

    // 初始化左右边界的最大高度
    int leftMax = 0, rightMax = 0;
    int left = 0, right = n - 1;
    int ans = 0;

    // 双指针从两端向中间移动
    while (left < right) {
        if (height[left] < height[right]) {
            // 如果左侧的条形高度小于右侧
            if (height[left] >= leftMax) {
                // 更新左侧的最大高度
                leftMax = height[left];
            }
            else {
                // 计算雨水量
                ans += leftMax - height[left];
            }
            left++;
        }
        else {
            // 右侧的条形高度不小于左侧
            if (height[right] >= rightMax) {
                // 更新右侧的最大高度
                rightMax = height[right];
            }
            else {
                // 计算雨水量
                ans += rightMax - height[right];
            }
            right--;
        }
    }

    return ans;
}

int main() {
    // 示例输入
    vector<int> height1 = { 0,1,0,2,1,0,1,3,2,1,2,1 };
    vector<int> height2 = { 4,2,0,3,2,5 };

    // 调用 trap 函数并打印结果
    cout << "Rainwater trapped by height1: " << trap(height1) << endl;
    cout << "Rainwater trapped by height2: " << trap(height2) << endl;

    return 0;
}
  • 输出结果:

Rainwater trapped by height1: 6
Rainwater trapped by height2: 9
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674942.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用 WM_WINDOWPOSCHANGING 跟踪窗口状态变化

在窗口位置变化过程的早期&#xff0c;系统会发送 WM_WINDOWPOSCHANGING 消息。 这个和 WM_WINDOWPOSCHANGED 消息不同&#xff0c;WM_WINDOWPOSCHANGED 消息发生在窗口位置变化之后。 一个关键的区别&#xff08;除了时间之外&#xff09;是&#xff0c;您可以通过处理 WM_WI…

OpenStreetMap部署(OSM)

参考&#xff1a;https://github.com/openstreetmap/openstreetmap-website/blob/master/DOCKER.md OpenStreeMap 部署 操作系统建议使用 Ubuntu 22 版本 安装 Docker # 更新软件包索引&#xff1a; sudo apt-get update # 允许APT使用HTTPS&#xff1a; sudo apt-get inst…

艰难求生的转型之路

起因 我个人“工作水平低&#xff0c;专业能力差。”是最核心的困难。 在坚持了快十年之后&#xff0c;博客从2015-2024。 2015201620172018201920202021202220232024 从2020年之后就已经开始全面转型之路。 所有传统赛道&#xff0c;都挤满了人&#xff0c;各种限制各种约…

【图像处理与机器视觉】灰度变化与空间滤波

基础 空间域与变换域 空间域&#xff1a;认为是图像本身&#xff0c;对于空间域的操作就是对图像中的像素直接进行修改 变换域&#xff1a;变换系数处理&#xff0c;不直接对于图像的像素进行处理 邻域 图像中某点的邻域被认为是包含该点的小区域&#xff0c;也被称为窗口 …

【Linux基础】安装redis

【Linux基础】安装redis 文章目录 【Linux基础】安装redis1、安装redis步骤2、启动redis3、redis停止 1、安装redis步骤 创建文件夹存放软件目录 [rootlocalhost ~]# mkdir /sort将Redis安装包上传到Linux到soft目录 解压安装包 cd /soft tar -xvf redis-4.0.0.tar.gz -C /usr/…

高速开箱机如何更加高效、智能化

在科技飞速发展的背景下&#xff0c;物流自动化已成为行业发展的必然趋势。其中&#xff0c;高速开箱机以其高效、精准的特性&#xff0c;在物流自动化领域大放异彩&#xff0c;成为推动行业发展的强大动力。星派将深入探讨高速开箱机在物流自动化中的应用与前景&#xff0c;展…

变现 5w+,一个被严重低估的 AI 蓝海赛道,居然用这个免费的AI绘画工具就能做!

大家好&#xff0c;我是画画的小强&#xff0c;致力于分享各类的 AI 工具&#xff0c;包括 AI 绘画工具、AI 视频工具、AI 写作工具等等。 但单纯地为了学而学&#xff0c;是没有任何意义的。 这些 AI 工具&#xff0c;学会了&#xff0c;用起来&#xff0c;才能发挥出他们的…

就凭这张图,下订华为享界S9

文 | Auto芯球 作者 | 雷慢 冲啦&#xff01;就在刚刚&#xff0c; 我们团队下订了一辆享界S9&#xff0c; 还琢磨买奔驰S级&#xff0c;宝马7系和奥迪A8的老板们&#xff0c; 是应该试试享界S9了&#xff0c; 至少先占个坑&#xff0c;8月底S9上市当天&#xff0c; 可以…

月入5000+?Midjourney制作小红书壁纸实现副业变现

一、制作步骤 使用Midjourney制作小红书壁纸的步骤比较简单&#xff0c;分为5步&#xff0c;其中最关键的步骤就是画出用户喜欢的壁纸。 1、绘画壁纸 在开始绘画之前&#xff0c;我们首先要确定好壁纸类型&#xff0c;小红书的壁纸类型有多种&#xff0c;包括剪纸类型、花草…

手机如何找回删除的视频?轻松有效的3个技巧分享!

无论是因为疏忽大意还是意外情况&#xff0c;视频被删除都是一个常见的问题&#xff0c;而视频作为一种重要的媒体形式&#xff0c;承载着我们的回忆和重要的信息&#xff0c;因此找回删除的视频具有重要的意义。该如何找回删除的视频呢&#xff1f;接下来&#xff0c;我们将详…

uniapp表格合并

最左边本来是三个td,但是要截图里面的效果,只需要rowspan"3" <tr><td rowspan"3" class"tdMoney1">A.2.8 经济来源</td><td class"tdMoney1" >A.2.8 经济1来源</td><td colspan"2"><…

4.21 Python实现将文件夹中的文件压缩

Python实现将文件夹中的文件压缩 可以使用 Python 的 shutil 和 os 模块来将文件夹 C:\Users\15640\Desktop\git\abc 中的所有文件打包成一个名为 abc.zip 的压缩包。 import shutil import os# 定义文件夹路径和压缩包名称 folder_path rC:\Users\15640\Desktop\git\abc zip_…

C语言Prim算法和Prim-Alternat找最小生成树

文章目录 1、用prim算法求最小生成树C语言Prim算法实现 2、用Prim-Alternate算法求最小生成树3、C语言Prim-Alternate算法实现 1、用prim算法求最小生成树 绿色线会标记选过的边 从v1当作起始点开始&#xff0c;可选择: (v1,v2)权值为6 &#xff08;v1,v3&#xff09;权值为3 &…

I P协议

IPv4首部 4个字节的32 bit值以下面的次序传输&#xff1a;首先是 0&#xff5e;7 bit&#xff0c;其次8&#xff5e;15 bit&#xff0c;然后1 6&#xff5e;23 bit&#xff0c;最后是24~31 bit。这种传输次序称作 big endian字节序。由于TCP/IP首部中所有的二进制整数在网络中传…

抖音直播统计、直播间无人互动直播效果软件--抖音大师!

抖音大师介绍 抖音大师是抖音直播统计、直播间无人互动直播效果软件&#xff0c;通过它&#xff0c;你可以快速添加直播互动效果&#xff01;软件使用C#开发&#xff0c;无论是内存占用还是执行效果都远比同行的效果高太多&#xff01;&#xff01;电脑所需性能大大降低&#x…

Day11:空间转换、动画

目标&#xff1a;使用 3d 空间转换、动画丰富网页元素的呈现方式。 一、空间转换 1、空间转换简介 空间&#xff1a;是从坐标轴角度定义的 X 、Y 和 Z 三条坐标轴构成了一个立体空间&#xff0c;Z 轴位置与视线方向相同空间转换也叫 3D 转换属性&#xff1a;transform 2、平移…

maybaits-plus新增拦截器动态修改sql与pageHelper结合的问题

需求&#xff1a; 对每个sql进行权限控制&#xff0c;判断用户是查询出来的数据 由于涉及到几十个sql的改造&#xff0c;都要增加这个条件&#xff0c;一个个改很麻烦&#xff0c;所以通过增加sql拦截器&#xff0c;给每个sql追加权限条件 以flowMapper.queryOverFlowPage为例&…

node版本的升级和降级

一、问题描述 在开发过程中&#xff0c;我们可能会遇到在A项目中用 node14 版本&#xff0c;而在B项目中要用 node16 版本&#xff0c;从而需要切换不同的 node 版本来开发项目。 二、安装 gnvm 1、在已经安装好 nodejs 的前提下&#xff0c;我们来安装 gnvm &#xf…

Linux[高级管理]——使用源码包编译安装Apache网站

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月31日14点20分 &#x1f004;️文章质量&#xff1a;96分 在Linux系统上编译和安装Apache HTTP Server是…

基于Vue3的Uniapp实训项目|一家鲜花店

基于Vue的Uniapp实训指导项目 项目预览&#xff1a; 在这里插入图片描述 pages.json {"pages": [ //pages数组中第一项表示应用启动页&#xff0c;参考&#xff1a;https://uniapp.dcloud.io/collocation/pages{"path": "pages/index/index",&…