Leetcode 42 接雨水

2023-05-16

Leetcode42接雨水

    • 题解1:正反两扫(Simple and effect)
    • 题解2:DP
    • 题解3:单调栈(单调栈存储的是下标,满足从栈底到栈顶的下标对应height的元素呈递减)
    • 题解4:双指针(dp/前后扫 plus-math related)

给定 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

来源:力扣(LeetCode)题目链接
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解1:正反两扫(Simple and effect)

class Solution {
public:
    int trap(vector<int>& height) {
        int s = height.size();
        if(1==s) return int(0);
        int i=0, j=0;
        int sum = 0;
        // 正扫
        while(i < s && j < s-1){
            if(height[++j] >= height[i]){
                sum += height[i]*(j-i-1);
                for(int x=i+1; x<j; x++){
                    sum -= height[x]; 
                }
                i = j;
            }    
        }
        // [i,j]区间没有比i更高的柱子了
        // 反扫
        if(j == s-1 && i != j){
            int n = j;
            // key
            while(j > i && n > i){
                if(height[--n] >= height[j]){
                    sum += height[j]*(j-n-1);
                    for(int x=j-1; x>n; x--){
                        sum -= height[x]; 
                    }
                    j = n;
                }   
            }
        } 
        return sum;
    }
};

在这里插入图片描述

题解2:DP

class Solution {
public:
    int trap(vector<int>& height) {
        const int s = height.size();
        if(1==s) return int(0);
        int leftMax[s]; // i以左(含i)最大值
        leftMax[0] = height[0];
        int rightMax[s]; //i以右(含i)最大值
        rightMax[s-1] = height[s-1];
        int sum = 0;
        for(int i=1; i<s; i++){
            leftMax[i] = max(leftMax[i-1], height[i]);
        }
        for(int i=s-2; i>=0; i--){
            rightMax[i] = max(rightMax[i+1], height[i]);
        }
        for(int i=0; i<s; i++){
        // 每个i对应的柱子能接的雨水量 = min(leftMax[i], rightMax[i])-height[i]  【纯纯math】
            sum += min(leftMax[i], rightMax[i])-height[i];
        }

        return sum;
    }
};

在这里插入图片描述

题解3:单调栈(单调栈存储的是下标,满足从栈底到栈顶的下标对应height的元素呈递减)

class Solution {
public:
    int trap(vector<int>& height) {
        const int s = height.size();
        if(1==s) return int(0);
        stack<int> sk;
        int sum(0);
        for(int i=0; i<s; i++){
        // key: 单调——所以需要把小的能接雨水的柱子都算完——栈空为止
            while(!sk.empty() && height[i] >= height[sk.top()]){
                auto m = sk.top();
                sk.pop();
                if(sk.empty()) break;
                sum += (min(height[i], height[sk.top()]) - height[m])*(i-sk.top()-1);
            }
            sk.push(i);
        }

        return sum;
    }
};

在这里插入图片描述

题解4:双指针(dp/前后扫 plus-math related)

class Solution {
public:
    int trap(vector<int>& height) {
        const int s = height.size();
        if(1==s) return int(0);
        int left(0), right(s-1);
        int leftMax = 0;
        int rightMax = 0;
        int sum = 0;
        while(left < right){
            leftMax = max(leftMax, height[left]);
            rightMax = max(rightMax, height[right]);
            // 木桶原理:最终计算 只与 小值有关
            if(leftMax < rightMax){
                sum += leftMax-height[left];
                left++;
            }else{
                sum += rightMax-height[right];
                right--;
            }
        }

        return sum;
    }
};

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Leetcode 42 接雨水 的相关文章

  • 匿名拓空者2四轴飞控程序标志位说明

    匿名四轴飞控程序标志位说明 标志位太多了 xff0c 我想把它们都理一下 xff0c 可能理不全 xff0c 我尽量 span class token keyword typedef span span class token keywor
  • 【CMake】CMake 编译选项设置

    CMake CMake 编译选项设置 在CMakeLists txt中可以通过修改CMake内置的环境变量来改变C或C 43 43 的编译选项 编译选项相关的CMake 变量如下 xff1a CMAKE C FLAGS span class
  • 树莓派4b开启vnc和无法连接解决方法

    树莓派4b开启vnc vnc开启 通过ssh连接到树莓派后运行如下命令 打开命令行 xff0c 输入 sudo raspi config xff0c 打开树莓派软件设置工具 选择 3 Interfacing Options 选择 I3 VN
  • Java中this的四种用法

    最近在学习代理模式的时候 xff0c 遇到了一个这样的this用法 xff0c 一下子把我搞懵了 xff0c 后面看了狂神的视频就理解了 xff0c 因此这里再巩固一下java基础 this的用法 xff01 在我使用jdk的动态代理时 x
  • 云服务器 nginx 部署多个Vue项目

    本篇文章不提供如何在服务器上安装nginx以及Vue打包 xff0c 相关内容请参考我另外一篇文章 xff1a 将Vue项目部署到服务器 注 xff1a 我的Vue cli版本为4 5 43 xff0c 如果不是4 43 的版本 xff0c
  • ubuntu修改apt为国内镜像源

    备份旧的源 span class token function sudo span span class token function cp span etc apt sources list etc apt sources list ba
  • 年度最理性 AI 分析文章:预测 AI 未来,大部分人陷入了 7 大误区

    来源 xff1a 36氪 概要 xff1a 错误的预测会导致大家对不会发生的事情感到恐惧 为什么在人工智能和机器人的预测上总有人不断犯错呢 xff1f 想着预测未来 xff0c 却一不小心就陷入了yy 近年来图像识别突破 Waymo无人车上

随机推荐

  • ESP8266-01S与PC通过网络助手的测试的AT指令

    这阵子在学esp8266 43 stm32的知识 xff0c 从小白学起 xff0c 一步一步记录着 工具 xff1a TTL usb xff0c esp8266 01s xff0c 杜邦线 xff0c xcom串口助手 如图 xff1a
  • 远程登录Linux时 mobaxterm出现连接超时

    远程登录Linux时 mobaxterm出现连接超时 问题描述 xff1a 远程登录Linux时 mobaxterm出现连接超时 解决办法 xff1a 第一步 xff1a 打开虚拟机 编辑 虚拟网络编辑器 VMnet8 NAT设置 记住子网
  • g2o的 cmakelists.txt编写问题

    slam 14讲ch6的g2o代码报错 xff1a CMakeFiles span class token operator span g2oCurveFitting span class token punctuation span di
  • apt-get命令详解

    apt 1 2 32ubuntu0 2 amd64 用法 xff1a apt get 选项 命令 apt get 选项 install remove 软件包1 软件包2 apt get 选项 source 软件包1 软件包2 apt get
  • 如何使用 datax 拉取 hive 中的数据到 oracle 中?

    需求 将 hive 中的数据拉取到 oracle 中 xff0c 使用的工具是 datax 步骤 1 先在 hive 中找一张需要拉取的表 xff0c 然后在 oracle 中创建对应的空表 xff0c 等待拉取数据 2 在 datax 的
  • Docker教程(3)——实例1

    Docker教程 xff08 3 xff09 运行一个web应用程序 在后文中将在docker容器中运行一个Python Flask应用运行一个web应用 文章目录 Docker教程 xff08 3 xff09 运行一个web应用程序1 载
  • 平衡车代码阅读,学习mpu6050滤波

    mpu6050 c include 34 MPU6050 h 34 include 34 IOI2C h 34 include 34 usart h 34 作者 xff1a 平衡小车之家 我的淘宝小店 xff1a http shop1144
  • 【慕伏白教程】在Vmware中安装Ubuntu流程

    慕伏白教程 在Vmware中安装Ubuntu流程 一 下载官方镜像二 新建虚拟机1 创建虚拟机2 安装系统镜像2 1 点击 编辑虚拟机设置 2 1 虚拟机设置 三 安装系统1 系统初始化1 1 点击 开启此虚拟机 1 2 选择 Try or
  • 《自动化学报》投稿成长日记

    自动化学报 投稿成长日记
  • openwrt 7621 使能ttyS1

    openwrt版本 15 05 release 1 修改openwrt 15 05 release target linux ramips dts下对应的dts文件 xff0c 取消uart2 uart3配置为gpio功能 将uart2 u
  • 安装ROS过程中的rosdep init 和 rosdep update 命令执行不成功的解决办法

    一 解决 rosdep init 命令执行不成功 xff1a 不成功信息 xff1a RROR cannot download default sources list from https raw githubusercontent co
  • STM32F1 定时器 PWM输入捕获两路

    IO u32 TIM4CH3 CAPTURE UPVAL 61 0 通道3捕获到高电平的时刻 IO u32 TIM4CH3 CAPTURE DOWNVAL 61 0 通道3捕获到低电平的时刻 IO u32 TIM4CH4 CAPTURE U
  • openwrt 使用uci更改ip

    以lan口举例 xff1a 设置lan口ip uci set network lan ipaddr 61 192 168 0 251 提交 uci commit network 重启网络 etc init d network restart
  • STM32F103 USART1串口重映射功能的实现

    STM32F103 USART1串口重映射实现方法代码 转载请注明出处 xff1a https blog csdn net qq 43400642 article details 84838405 我们知道 xff0c F103的usart
  • FreeRTOS api库函数之Message Buffers(消息缓冲区)

    xMessageBufferCreate xff08 xff09 MessageBufferHandle t xMessageBufferCreate xff08 size t xBufferSizeBytes xff09 使用动态分配的内
  • C/C++经典程序之打印三角形

    等腰直角三角形 xff08 直角边在左下 xff09 include lt stdio h gt int main int i j int line printf 34 请输入行数 xff1a 34 scanf 34 d 34 amp li
  • STM32F4 DMA

    STM32F4有2个DMA xff0c 每个DMA控制器有8个数据流 xff0c 每个数据流有多达8个通道 xff0c 但是DMA1 控制器 AHB 外设端口与 DMA2 控制器的情况不同 xff0c 不连接到总线矩阵 xff0c 因此 x
  • STM32粗略延时,大致精确

    考虑到一些情况下 xff0c 无法使用系统定时或者定时器 xff0c 而进行的时间计算 STM32F1系列 xff0c 对于72Mhz来说 void my delay ms u32 ms 对于stm32f1系列 72mhz大致是1ms u1
  • linux下的串口配置

    经过验证是准确无误的 xff0c 配置以后可以通过以下指令查看 stty F dev ttyUSB0 a 查看 dev ttyUSB0的串口配置 stty F dev ttyUSB0 ispeed 115200 ospeed 115200
  • Leetcode 42 接雨水

    Leetcode42接雨水 题解1 xff1a 正反两扫 xff08 Simple and effect xff09 题解2 xff1a DP题解3 xff1a 单调栈 xff08 单调栈存储的是下标 xff0c 满足从栈底到栈顶的下标对应