代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素I

本文主要是介绍代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素I,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.每日温度
  • 2.下一个更大元素I


1.每日温度

给定一个整数数组 temperatures,表示每天的温度,返回一个数组 answer,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

  • 示例 1:

    输入: temperatures = [73,74,75,71,69,72,76,73]
    输出: [1,1,4,2,1,1,0,0]

  • 示例 2:

    输入: temperatures = [30,40,50,60]
    输出: [1,1,1,0]

  • 示例 3:

    输入: temperatures = [30,60,90]
    输出: [1,1,0]

提示:

  • 1 <= temperatures.length <= 10^5
  • 30 <= temperatures[i] <= 100

单调栈解法,用于一维数组寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,本质是空间换时间
求一个元素右边第一个更大元素,那就是从栈头到栈底递增,反之亦然。
具体操作流程如下: 通过遍历数组,将数组元素按照遍历规则压入栈(栈中元素就是待寻找下一个最大值的元素),保证栈头到栈底递增。这样在每一次遍历元素栈头元素比较的时候,就能找到栈头元素的下一个最大值了
遍历规则就是遍历元素栈头元素大,说明找到下一个最大值,此时弹出栈记录与最大值距离。直到遍历元素栈头元素小,此时压入当前遍历元素到栈头
代码如下:

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {stack<int> st;//单调栈vector<int> result(temperatures.size(), 0);//存放结果st.push(0);//第一个标号压入栈,栈中只存放元素标号for (int i = 1; i < temperatures.size(); i++) {if (temperatures[i] <= temperatures[st.top()]) {//小于等于栈顶元素可以压入栈,保证从栈头到栈底递增st.push(i);}else {while (!st.empty() && temperatures[i] > temperatures[st.top()]) {//遇到大于栈头元素,开始计算元素距离result[st.top()] = i - st.top();st.pop();}st.push(i);}}return result;}
};

时间复杂度:O(n)
空间复杂度:O(n)

2.下一个更大元素I

给定两个没有重复元素的数组 nums1nums2,其中 nums1nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 xnums2 中对应位置右侧的第一个比 x 大的元素。

返回一个数组 ans,其中 ans[i] 表示按 nums1 索引顺序排列的每个数字的下一个更大元素。如果不存在,则对应位置输出 -1

  • 示例 1:

    输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
    输出:[-1,3,-1]
    解释:

    • 对于 nums1 中的数字 4nums2 中其右侧没有比它更大的数字,因此输出 -1
    • 对于 nums1 中的数字 1nums2 中数字 1 右侧的下一个较大数字是 3
    • 对于 nums1 中的数字 2nums2 中其右侧没有比它更大的数字,因此输出 -1
  • 示例 2:

    输入:nums1 = [2,4], nums2 = [1,2,3,4].
    输出:[3,-1]
    解释:

    • 对于 nums1 中的数字 2nums2 中数字 2 右侧的下一个较大数字是 3
    • 对于 nums1 中的数字 4nums2 中其右侧没有比它更大的数字,因此输出 -1

提示:

  • 1 <= nums1.length <= nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 104
  • nums1nums2 中所有整数互不相同
  • nums1 中的所有整数同样出现在 nums2

进阶: 你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

我们先找到nums2中每一个下一个比其大的值,然后判断是否存在于nums1。
下一个比其大的值使用单调栈方法


class Solution {
public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> result(nums1.size(), -1);if (nums1.size() == 0) return result;unordered_map<int, int> umap; // key:下标元素,value:下标for (int i = 0; i < nums1.size(); i++) {umap[nums1[i]] = i;}st.push(0);for (int i = 1; i < nums2.size(); i++) {if (nums2[i] <= nums2[st.top()]) {           // 情况一st.push(i);} else {                                    // 情况三while (!st.empty() && nums2[i] > nums2[st.top()]) {if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标result[index] = nums2[i];}st.pop();}st.push(i);}}return result;}
};

这篇关于代码随想录算法训练营第五十八天|739. 每日温度、496.下一个更大元素I的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803169

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

python获取cmd环境变量值的实现代码

《python获取cmd环境变量值的实现代码》:本文主要介绍在Python中获取命令行(cmd)环境变量的值,可以使用标准库中的os模块,需要的朋友可以参考下... 前言全局说明在执行py过程中,总要使用到系统环境变量一、说明1.1 环境:Windows 11 家庭版 24H2 26100.4061

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元