代码随想录训练营第59天|LeetCode 503.下一个更大元素II、42. 接雨水

news2025/2/22 3:20:55

参考

代码随想录

题目一:LeetCode 503.下一个更大元素II

这个题在496. 下一个更大元素 I基础上数组变成了环,其实两次两次数组就可以了。代码如下:

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        vector<int> result(nums.size(), -1);
        stack<int> stk;
        for(int i = 0; i < 2 * nums.size(); i++){
            int j = i % nums.size();
            while(!stk.empty() && nums[stk.top()] < nums[j]){
                result[stk.top()] = nums[j];
                stk.pop();
            }
            stk.push(j);
        }
        return result;
    }
};

题目二:LeetCode 42. 接雨水

双指针法

按照列来计算,每列的宽度是1,因此将问题转化为求每一列的高度就可以了。
在这里插入图片描述
每一列的高度等于其左边最高柱子和右边最高柱子中的较小值,如下图所示:
在这里插入图片描述
图中阴影柱子的高度就是两个红色柱子中高度较小的那个,即图中左边的红色柱子,再减去自身的高度就得到了雨水的体积。因此,对于每个柱子,要找到其左边和右边的最高柱子。代码实现如下:

class Solution {
public:
    int trap(vector<int>& height) {
        int result = 0;
        for(int i = 0; i < height.size(); i++){
            int r_height = height[i];   //左边最高的柱子高度
            int l_height = height[i];   //右边最高的柱子高度
            for(int j = i-1; j >=0; j --)
                if(height[j] > l_height)    l_height = height[j];
            for(int j = i + 1; j < height.size(); j++)
                if(height[j] > r_height)    r_height = height[j];
            result += min(l_height,r_height) - height[i];
        }
        return result;
    }
};

上面的代码提交之后会有两个测试用例超时,其他能通过。

动态规划

由上面的双指针可以看出,在每个位置需要知道其左边和右边的最高柱子,在动态规划中,用dp数组来记录两边的最高柱子。

  1. 确定dp数组下标及其含义
    dp[i][0]:第i个柱子左边的最高柱子高度为dp[i][0].
    dp[i][1]:第i个柱子右边的最高柱子的高度为dp[i][1].

  2. 确定递推公式
    递推公式如下:

dp[i][0] = max(dp[i-1][0],height[i]);
dp[i][1] = max(dp[i+1][1],height[i]);
  1. 初始化dp数组
dp[0][0] = height[0];
dp.back()[1] = height.back();
  1. 确定遍历顺序
    对于dp[i][0],要从小到大遍历;
    对于dp[i][1],要从大到小遍历。

  2. 举例推导dp数组
    在这里插入图片描述
    完整的代码实现如下:

class Solution {
public:
    int trap(vector<int>& height) {
        vector<vector<int>> dp(height.size(), vector<int>(2));
        int result = 0;
        dp[0][0] = height[0];
        dp.back()[1] = height.back();
        //求dp数组
        for(int i = 1; i < height.size(); i++)
            dp[i][0] = max(dp[i-1][0],height[i]);
        for(int i = height.size() - 2; i >= 0; i--)
            dp[i][1] = max(dp[i+1][1],height[i]);
        //求体积
        for(int i = 0; i < dp.size(); i++){
            result += min(dp[i][0],dp[i][1]) - height[i];
        }
        return result;
    }
};

单调栈

在单调栈解法中,要按照行来计算,如下图所示:
在这里插入图片描述
栈内的元素从栈顶到栈底递增,即栈顶元素是最小的,当前元素数值和栈顶元素数值存在下面的三种可能:

  • 当前元素大于栈顶元素,此时可以弹出栈顶元素计算雨水的体积了,如下图所示。弹出栈顶元素左为容器的“底”,当前的元素和新的栈顶元素构成容器的边,计算完成之后,再次比较当前元素和栈顶元素,重复上面的操作,知道当前元素小于栈顶元素或者栈中只有一个元素。注意,实际代码中栈里保存的是元素的下标。
    在这里插入图片描述

  • 当前元素等于栈顶元素,则弹出栈顶元素,将新的元素的下标入栈,因为我们需要用最右边的柱子来计算,如下图所示。
    在这里插入图片描述

  • 当前元素小于栈顶元素,则直接将当前元素入栈。

再次强调,实际代码中栈里保存的是元素下标,因为需要用下标来计算宽度。

代码实现如下:

class Solution {
public:
    int trap(vector<int>& height) {
        int result = 0;
        stack<int> stk;
        for(int i = 0; i < height.size(); i++){
            while(!stk.empty() && height[i] >= height[stk.top()]){
                int tmp = stk.top();
                stk.pop();
                if(!stk.empty()){   //至少要三个柱子
                    int w = i - stk.top() - 1;  //宽
                    int h = min(height[i],height[stk.top()]) - height[tmp]; //高
                    result += w * h;
                }
            }
            stk.push(i);
        }
        return result;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

即时通讯实时视频聊天技术提供QoS保证的方法

随着WebRTC标准的逐步推广&#xff0c;实时音视频通讯技术受到越来越多公司和技术人员的关注。 对于交互式音视频应用而言&#xff0c;稳定、低延时、通话质量清晰可靠是其基本需求。在互联网环境下&#xff0c;音视频的通话质量与以下因素有关&#xff1a;一是编码码率、帧率和…

Opencv IplImage 和 Mat 使用介绍

1. IPIImage 使用介绍 IplImage是OpenCV中CxCore部分基础的数据结构&#xff0c;用来表示图像&#xff0c;其中Ipl是Intel Image Processing Library的简写。以下是IplImage的结构分析。参见:OpenCV中文网站 typedef struct _IplImage{int nSize; /* IplImage大小 *…

70页幻灯片图解“工信领域数据安全管理办法”等五部委数据法规

国家安全是民族复兴的根基。党的二十大报告指出&#xff0c;“加快建设制造强国、质量强国、航天强国、交通强国、网络强国、数字中国”、“推进国家安全体系和能力现代化”、“强化经济、重大基础设施、金融、网络、数据、生物、资源、核、太空、海洋等安全保障体系建设”。数…

02-redis篇 redis事务处理及使用方式

目录 1. 事务简介: -> 1.1 必须满足: ACID四个特性(原子性,一致性,隔离性,持久性) -> 1.2 简单理解: 一个业务,也可以看成是一个逻辑工作单元; 2. redis 操作事务的基本指令 -> 指令: -> 图式: 3. 模拟多事务操作(watch乐观锁) 3.1 不开启乐观锁watch操作…

Linux Python安装

1.到官网下载适合自己的版本 Python Source Releases | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downloads/source/2.下载好压缩包之后&#xff0c;将压缩包解压开 3.将开发环境的依赖包准备好 yum -y install zlib-devel bz…

阅读笔记 MulDA: DAGA向多语言方向的拓展

阅读笔记 MulDA: DAGA向多语言方向的拓展 文章目录阅读笔记 MulDA: DAGA向多语言方向的拓展前言概述IntroductionMulDA: Our Multilingual Data Augmentation Framework1、Labeled Sequence Translation2、Synthetic Data Generation with Language Models3、Semi-supervised M…

Tableau可视化设计案例-05Tableau进阶

文章目录Tableau可视化设计案例05Tableau进阶1.数据集合并1.1 数据导入界面1.2超市销售情况符号地图1.3智能显示1.4 仪表盘高级应用Tableau可视化设计案例 本文是Tableau的案例&#xff0c;为B站视频的笔记&#xff0c;B站视频 参考&#xff1a;https://www.bilibili.com/vide…

怎么使用CAM350检查Gerber?

文章目录什么是Gerber文件&#xff1f;Gerber中的文件由那些组成&#xff1f;怎么使用CAM350检查Gerber&#xff1f; ——导入CAM350的基础操作&#xff1a;对层的操作什么是Gerber文件&#xff1f; Gerber文件是设计完后PCB(brd文件)板文件后交给板厂制造成品的文件。Gerber一…

代码随想录刷题记录 day50 每日温度+下一个更大元素 I

代码随想录刷题记录 day50 每日温度下一个更大元素 I 739. 每日温度 思想 1.暴力解 两次for 超时了 2.单调栈 花了点时间理解的。 单调栈的基础入门题。找到一个数组中右边的第一个大于 等于 或者小于当前元素的下标的位置 以时间换空间&#xff0c;用一个栈来记录右边第…

明道云联合RestCloud打造APaaS+IPaaS融合解决方案

背景介绍 APaaSIPaaS发展趋势 随着企业规模的扩张以及业务需求变化越来越快&#xff0c;企业现有IT系统无法快速应对前端敏捷化的需求。企业IT架构将朝着敏捷化、低代码化、服务化方向发展&#xff0c;而APaaSIPaaS解决方案在这种需求下应运而生&#xff0c;IPaaS可以把现有固…

ARAS plm安装,各种踩坑

目录准备工作sql server安装NET Framework安装许可申请IIS服务开启IIS无法启动报错 HTTP 错误 500.19 - Internal Server Error错误变为 aras Error: Cannot access OAuth Server due to 500 (Internal Server Error)**Aras安装准备工作 sql server安装 登录出现的几个错误 s…

Python数据分析挖掘案例:Python爬虫助力疫情数据追踪

通过学习Python数据分析挖掘案例&#xff0c;可以掌握通过Python爬虫获取的数据进行处理以及可视化分析的主要方法和技能&#xff0c;并为后续相关课程学习及将来从事数据分析工作奠定基础。 新冠病毒疫情在武汉突然爆发&#xff0c;确诊病例、疑似病例、死亡病例等数据牵动着每…

Binary number

A binary number is a number expressed in the base-2 numeral system or binary numeral system, a method of mathematical expression which uses only two symbols: typically “0” (zero) and “1” (one). The base-2 numeral system is a positional notation with a…

5G FWA市场一跃而上,四信多款5G终端赋能FWA典型应用

随着国家政策相继出台&#xff0c;全球5G基础设施建设日益完善&#xff0c;带动千行百业的巨大变革。以工业互联网、远程医疗、车联网、消费级硬件等为例的应用场景均在5G加持下实现跨越式升级。与此同时&#xff0c;5G FWA作为弥合光纤欠发达地区数字鸿沟挑战的“杀手级应用”…

【kafka】学习笔记(一)

学习笔记一、概述1.1、MQ1.2、kafka1.3、消息队列的两种模式1.3.1、点对点1.3.2、订阅与发布1.4、Kafka基础架构二、安装2.1、 集群规划2.2、 下载安装2.3、 集群启动脚本三、Kafka命令行操作3.1、主题命令行操作3.2、生产者命令行操作3.3、消费者命令行操作四、 Kafka 生产者4…

常用的Linux命令介绍

ls&#xff1a; 如何区分一个文件类型是 文件夹 还是 普通文件&#xff1a; “-” 类型 表示是 普通文件 “d” 类型 表示是 文件夹 cd&#xff1a; cd -返回进入此目录前所在的目录 cd ~如果是root用户&#xff0c;相当于 cd /root&#xff1b;如果是普通用户&#xff0c;相…

7、操作系统之间的文件传输

Windows 与 Linux 在Windows与Linux中传输文件的常用方式有两种&#xff0c;一种是使用使用XFTP工具&#xff0c;另一种是使用rz sz 命令的方式进行 lrzsz 安装 yum install lrzsz -y 1&#xff09;rz 将文件从window上传到Linux 2&#xff09;sz 将文件从linux传输到window …

常用排序算法哪个效率更高之从理论到实践

前面整理了一篇关于排序算法的基础类库&#xff1a;基本排序算法类SortHelper 这里我们来看看这几个算法哪个效率更高一点呢&#xff1f; 1、先从理论来看看这几个算法 1、冒泡排序法 基本思想&#xff1a;两两比较待排序数据元素的大小&#xff0c;发现两个数据元素的次序…

RSA和AES的使用

文章目录为什么要对数据传输加密对称加密和非对称加密密钥的几种格式非对称加密算法----RSA算法产生公私密钥对对称加解密算法AES为什么要结合使用这两种算法利用RSA来加密传输AES的密钥&#xff0c;用AES来加密数据&#xff0c;思路如下&#xff1a;特点分析&#xff1a;参考链…

【探索Spring底层】14.谈谈参数解析器

文章目录1. 参数解析器概述2. 常见参数的解析1. 参数解析器概述 参数解析器是Spring-Web包提供的组件&#xff0c;并且SpringMVC中提供了很多参数解析器。 常见的参数解析器如下 org.springframework.web.method.annotation.RequestParamMethodArgumentResolverabbc908org.s…