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 接雨水 的相关文章

  • 【LeetCode:1423. 可获得的最大点数 | 滑动窗口】

    算法题 算法刷题专栏 面试必备算法 面试高频算法 越难的东西 越要努力坚持 因为它具有很高的价值 算法就是这样 作者简介 硕风和炜 CSDN Java领域新星创作者 保研 国家奖学金 高中学习JAVA 大学完善JAVA开发技术栈 面试刷题
  • 力扣(LeetCode)1038. 从二叉搜索树到更大和树(C++)

    先序遍历 根据题意 给定一个二叉搜索树 root BST 请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和 模拟二叉搜索树替换到 更大和数 的过程 请了解性质 二叉搜索树的先序遍历 是一个正序数组 直观思路 先序遍历 左根
  • Leetcode2661. 找出叠涂元素

    Every day a Leetcode 题目来源 2661 找出叠涂元素 解法1 哈希 题目很绕 理解题意后就很简单 由于矩阵 mat 中每一个元素都不同 并且都在数组 arr 中 所以首先我们用一个哈希表 hash 来存储 mat 中每
  • leetcode:93. 复原 IP 地址

    复原 IP 地址 中等 1 4K 相关企业 有效 IP 地址 正好由四个整数 每个整数位于 0 到 255 之间组成 且不能含有前导 0 整数之间用 分隔 例如 0 1 2 201 和 192 168 1 1 是 有效 IP 地址 但是 0
  • LeetCode经典150题Golang版.121. 买卖股票的最佳时机

    题目 121 买卖股票的最佳时机 给定一个数组 prices 它的第 i 个元素 prices i 表示一支给定股票第 i 天的价格 你只能选择 某一天 买入这只股票 并选择在 未来的某一个不同的日子 卖出该股票 设计一个算法来计算你所能获
  • 【LeetCode:162. 寻找峰值 | 二分】

    算法题 算法刷题专栏 面试必备算法 面试高频算法 越难的东西 越要努力坚持 因为它具有很高的价值 算法就是这样 作者简介 硕风和炜 CSDN Java领域新星创作者 保研 国家奖学金 高中学习JAVA 大学完善JAVA开发技术栈 面试刷题
  • 扬帆证券:什么是股票股利?它和现金股利之间的区别是什么?

    什么是股票股利 股票股利是公司以其所发行股票作为股利的支付办法 它将发放的分红换算为等值的股份 完结持股人股份的增加 对公司来说 选用股票股利进行无偿增发新股时 既不减少公司现金 又能给予股东利润 值得一提的是 如果公司采取现金股利的分红支
  • 力扣每日一题:162. 寻找峰值(2023-12-18)

    力扣每日一题 题目 162 寻找峰值 日期 2023 12 18 用时 10 m 9 s 时间 0 ms 内存 40 54 MB 代码 class Solution public int findPeakElement int nums i
  • LeetCode21. Merge Two Sorted Lists

    文章目录 一 题目 二 题解 一 题目 You are given the heads of two sorted linked lists list1 and list2 Merge the two lists into one sort
  • 代码随想录算法训练营第42天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

    416 分割等和子集 已解答 中等 相关标签 相关企业 给你一个 只包含正整数 的 非空 数组 nums 请你判断是否可以将这个数组分割成两个子集 使得两个子集的元素和相等 示例 1 输入 nums 1 5 11 5 输出 true 解释
  • 面试150-13(Leetcode238除自身以外数组的乘积)

    代码 class Solution public int productExceptSelf int nums int n nums length int res new int n int product 1 int zerocnt 0
  • 代码随想录算法训练营第42天| ● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

    416 分割等和子集 已解答 中等 相关标签 相关企业 给你一个 只包含正整数 的 非空 数组 nums 请你判断是否可以将这个数组分割成两个子集 使得两个子集的元素和相等 示例 1 输入 nums 1 5 11 5 输出 true 解释
  • 《LeetCode力扣练习》代码随想录——双指针法(替换数字---Java)

    LeetCode力扣练习 代码随想录 双指针法 替换数字 Java 刷题思路来源于 代码随想录 54 替换数字 受制于语言限制 普通解法 import java util Scanner class Main public static v
  • LeetCode经典150题.274.H指数

    题目 274 H 指数 给你一个整数数组 citations 其中 citations i 表示研究者的第 i 篇论文被引用的次数 计算并返回该研究者的 h 指数 根据维基百科上 h 指数的定义 h 代表 高引用次数 一名科研人员的 h 指
  • Leetcode 45 跳跃游戏 II

    题意理解 给定一个长度为 n 的 0 索引 整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 还是从初始坐标i 0的位置到达最后一个元素 但是问题不是能不能跳到 而是 最少几步能跳到最
  • Leetcode 55 跳跃游戏

    题意理解 非负整数数组 nums 最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 需要跳到nums最后一个元素即为成功 目标 是否能够跳到最后一个元素 解题思路 使用贪心算法来解题 需要理解局部解和最优解的关系
  • Leetcode 45 跳跃游戏 II

    题意理解 给定一个长度为 n 的 0 索引 整数数组 nums 初始位置为 nums 0 每个元素 nums i 表示从索引 i 向前跳转的最大长度 还是从初始坐标i 0的位置到达最后一个元素 但是问题不是能不能跳到 而是 最少几步能跳到最
  • 二分查找(二)

    点名 点名 某班级 n 位同学的学号为 0 n 1 点名结果记录于升序数组 records 假定仅有一位同学缺席 请返回他的学号 二分法思路 判断数组的值和对应的下标是否相等 将数组分为两个区间 不相等区间的最左端 就是第缺席的同学的学号
  • LeetCode-数组-双指针-中等难度

    文章目录 双指针 1 删除有序数组中的重复项 入门 1 1 题目描述 1 2 解题思路 1 3 代码实现 2 删除有序数组中的重复项 II 简单
  • ​LeetCode解法汇总83. 删除排序链表中的重复元素

    目录链接 力扣编程题 解法汇总 分享 记录 CSDN博客 GitHub同步刷题项目 https github com September26 java algorithms 原题链接 力扣 LeetCode 描述 给定一个已排序的链表的头

随机推荐

  • 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 满足从栈底到栈顶的下标对应