739.每日温度 496.下一个更大元素 I

739.每日温度 496.下一个更大元素 I

739.每日温度

力扣题目链接(opens new window)

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

思路

思路:单调栈
题目的暴力算法很好想,双重for循环遍历即可,这里就不多介绍了。介绍下单调栈思路
所谓单调栈,就是栈内元素单调。要么递增要么递减。那么单调栈的使用场景是什么呢?
通常是一维数组,要寻找任意元素,左右两边第一个比其大或者比其小的元素位置,就可用单调栈
本题目是找到当前元素右侧第一个比其大元素位置,可用单调栈思路
单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。
使用单调栈注意两点
1.单调栈内存储数组元素下标
2.单调栈内存储元素的顺序如何确认?这里指的顺序【从栈头到栈底的顺序】。对于本题目要使用递增循序(再强调一下是指从栈头到栈底的顺序),
即如果求元素右边第一个比其大的元素位置,那么单调栈递增。求元素右边第一个比其小的元素位置,那么单调栈递减。
使用单调栈主要有三个判断条件。
-当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
-当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
-当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
看文字不太好理解这三个判断条件,举例画图理解。temperatures = [73, 74, 75, 71, 71, 72, 76, 73]为例来逐步分析,输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

首先先将第一个遍历元素加入单调栈

在这里插入图片描述


加入T[1] = 74,因为T[1] > T[0](当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况)。

我们要保持一个递增单调栈(从栈头到栈底),所以将T[0]弹出,T[1]加入,此时result数组可以记录了,result[0] = 1,即T[0]右面第一个比T[0]大的元素是T[1]。

在这里插入图片描述


加入T[2],同理,T[1]弹出

在这里插入图片描述


加入T[3],T[3] < T[2] (当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况),加T[3]加入单调栈。

在这里插入图片描述


加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,不用计算距离,因为我们要求的是右面第一个大于本元素的位置,而不是大于等于!

在这里插入图片描述


加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result 在这里插入图片描述


T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[3]继续弹出,同时计算距离,更新result 在这里插入图片描述


直到发现T[5]小于T[st.top()],终止弹出,将T[5]加入单调栈

在这里插入图片描述


加入T[6],同理,需要将栈里的T[5],T[2]弹出

在这里插入图片描述


同理,继续弹出

在这里插入图片描述


此时栈里只剩下了T[6]

在这里插入图片描述


加入T[7], T[7] < T[6] 直接入栈,这就是最后的情况,result数组也更新完了。

在这里插入图片描述

此时有同学可能就疑惑了,那result[6] , result[7]怎么没更新啊,元素也一直在栈里。

其实定义result数组的时候,就应该直接初始化为0,如果result没有更新,说明这个元素右面没有更大的了,也就是为0。

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

代码如下

public static void main(String args[]) {
    int[] temperatures = new int[]{73, 74, 75, 71, 69, 72, 76, 73};
    dailyTemperatures(temperatures);
}

public static int[] dailyTemperatures(int[] temperatures) {
    if (temperatures == null)
        return null;
    int[] result = new int[temperatures.length];
    Stack<Integer> stack = new Stack<>();// 单调递增(从栈头到栈底),存储数组元素下标
    stack.push(0);
    for (int i = 1; i < temperatures.length; i++) {
        int topElement = stack.peek();

        while (temperatures[i] > temperatures[topElement]) {

            Integer dropElement = stack.pop();
            result[dropElement] = i - dropElement;
            if (stack.isEmpty()) {// 栈内无元素可出栈
                break;
            }
            topElement = stack.peek();
        }
        stack.push(i);

    }
    return result;
}

496.下一个更大元素 I

力扣题目链接(opens new window)

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

示例 1:

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。

示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出-1 。

提示:

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

思路

单调栈
本题目和【739. 每日温度】一样均使用单调栈解决,但要处理nums1和nums2之间映射关系,导致本题难度偏高一些
如果做过【739. 每日温度】,那么求出Nums2的每个元素在 nums2 中的下一个比其大的值,还是很简单的
题目要求找出 nums1 中每个元素在 nums2 中的下一个比其大的值。两者之间映射关系如何确定呢?我第一次做也搞不明白怎么映射。看了下题解可以使用hashMap
使用map的key存储nums[i],value存储i.根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过。
题目说如果不存在对应位置就输出 -1 ,所以定义的result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。
时间复杂度:O(n)
空间复杂度:O(n)

代码如下

public static void main(String args[]) {
    int[] nums1 = new int[]{4, 1, 2};
    int[] nums2 = new int[]{1, 3, 4, 2};
    nextGreaterElement(nums1, nums2);
}


public static int[] nextGreaterElement(int[] nums1, int[] nums2) {
    if (nums1 == null || nums2 == null)
        return null;
    Map<Integer, Integer> map = new HashMap<>();// 保存nums1的value 和下标i
    for (int i = 0; i < nums1.length; i++) {
        map.put(nums1[i], i);
    }

    int[] nums1Result = new int[nums1.length];// 保存Nums1每一个元素右侧第一个比其大的元素value
    // 初始化value为-1
    Arrays.fill(nums1Result, -1);
    Stack<Integer> stack = new Stack<>();
    stack.push(0);
    for (int i = 1; i < nums2.length; i++) {
        int stackTop = stack.peek();
        while (nums2[i] > nums2[stackTop]) {
            stackTop = stack.pop();

            if (map.containsKey(nums2[stackTop])) {
                nums1Result[map.get(nums2[stackTop])] = nums2[i];
            }
            if (stack.isEmpty())
                break;
            stackTop = stack.peek();
        }
        stack.push(i);
    }


    return nums1Result;
}

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

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

相关文章

MSVS C# Matlab的混合编程系列1 - 看似简单的问题引出

前言&#xff1a; 问题提出&#xff0c;如何把Matlab(本文简称MT)的算法集成到Visual Studio(本文简称VS)里面运行&#xff1f; 本文&#xff0c;通过编制一个MT中最简单的加法函数&#xff0c;我们把他做成 MSVS C#能够使用的动态库&#xff0c;说明了MSVS C# 和 MT集成的最…

Adobe全新AI驱动的Premiere Pro功能消除了枯燥的音频编辑任务

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

亚信安慧AntDB数据库:开辟数据库新纪元

在数字化时代的快速发展中&#xff0c;数据成为企业的核心资产&#xff0c;而数据库则是管理和利用这些数据的关键。 为满足企业日益复杂的混合负载场景和混合数据类型业务需求&#xff0c;亚信科技AntDB提出了全新的“超融合”理念。该理念将多引擎、多能力融合在一起&#x…

Docker(二)安装指南:主要介绍在 Linux 、Windows 10 和 macOS 上的安装

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 安装 Docker Docker 分为 stable test 和 nightly 三个更新频道。 官方网站上有各种环境下的 安装指南&#xff0c;这里主要介绍 Docker 在…

Java进阶-Tomcat发布JavaWeb项目

对于云服务器&#xff0c;程序员一般不会陌生&#xff0c;如果项目需要发布到现网&#xff0c;那么服务器是必不可缺的一项硬性条件&#xff0c;那么如何在云服务器上部署一个项目&#xff0c;需要做哪些配置准备&#xff0c;下面就由本文档为大家讲解&#xff0c;本篇以Tomcat…

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章&#xff1a;jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master&#xff1a;https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp&#xff0c;…

街机模拟游戏逆向工程(HACKROM)教程:[10]68K汇编add指令

我们之前已经介绍了move指令&#xff0c;从本章开始&#xff0c;我们会一步步介绍更多的M68K指令。 简介&#xff1a; add :加法指令 该指令的作用是[源操作数]加[目的操作数]&#xff0c;结果传递至[目的操作数]&#xff0c;[源操作数]保持不变。 例子&#xff1a;…

MySQL复合查询 内外连接

目录 前言&#xff1a; 多表查询&#xff1a; 显示部门号为10的部门名&#xff0c;员工名和工资 : 显示各个员工的姓名&#xff0c;工资&#xff0c;及工资级别: 自连接 显示员工FORD的上级领导的编号和姓名(mgr是员工领导的编号&#xff09; 子查询 单行子查询&#…

汽车微电机行业研究:预计2029年将达到188亿美元

微电机行业是技术密集型行业&#xff0c;其起源于欧洲的德国、瑞士等国家&#xff0c;发展于日本。随着改革开放&#xff0c;中国作为发展中国家&#xff0c;承接了德国、日本等发达国家的汽车微电机产业转移&#xff0c;技术扩散逐步向我国转移。 微特电机广泛应用于信息处理设…

[Python] 如何通过ctypes库来调用C++ 动态库 DLL?

ctypes库介绍 ctypes是Python的一个外部库,它提供了一种灵活的方式来调用C语言的动态链接库(DLL)或共享库(SO)。通过ctypes,我们可以在Python中直接调用C语言编写的函数和变量,从而实现跨语言的互操作。 ctypes 它提供了与 C 兼容的数据类型,并允许调用 DLL 或共享库中的…

数学建模美赛资料(赛题+获奖论文更新)

数学建模美赛历年真题可以帮助我们了解比赛的出题思路&#xff0c;对建模比赛有一个大致的了解。 在备赛过程中&#xff0c;通过往年真题&#xff0c;我们可以了解考试的范围和重点&#xff0c;做到心中有数&#xff0c;可以有的放矢。通过真题&#xff0c;我们可以感受到各个…

Java 方法(方法的调用机制、方法的传参机制)

方法 方法就是将一个功能抽取出来&#xff0c;把代码单独定义在一个大括号内&#xff0c;形成一个单独的功能。 当需要这个功能的时候&#xff0c;就可以去调用。这样即实现了代码的复用性&#xff0c;也解决了代码冗余的现象。 修饰符 返回值类型 方法名 &#xff08;参数列…

CC工具箱使用指南:【计算面积】

一、简介 在Arcgis中&#xff0c;如果要计算面要素的面积&#xff0c;有几种方法。 1、gdb数据会自带一个shape_area字段&#xff0c;这就是面的平面面积&#xff0c;单位是平方米&#xff1a; 2、在双精度字段上右键单击&#xff0c;在弹出的菜单中点击【计算几何】&#xf…

制造业企业数字化转型难点剖析及解决之法

导语 全球正在由工业经济向数字经济转型过渡&#xff0c;制造业正在且并将长期处于数字化转型发展阶段&#xff0c;并沿着数字化、网络化、智能化阶段不断跃升。但如何找准数字化转型的切入点&#xff0c;以低耗能、低成本、高效率的方式加快制造业转型升级的步伐&#xff0c;仍…

普兰资产(PLAN B KRYPTO ASSETS):Schutz AI 公链引领数字资产新时代

比特B ETF是金融技术革命的起始 普兰资产&#xff08;PLAN B KRYPTO ASSETS&#xff09;执行长Jonah Fischer指出&#xff0c;比特B ETF 仅是迈向金融领域技术革命的首个阶段。他认为比特B现货 ETF 提供了投资者接触年轻且具有风险性的资产的途径&#xff0c;但他强调区块链技术…

Linux自动化构建工具——make和Makefile使用详解

一、初步认识make和Makefile 我们首先需要知道的是&#xff0c;make是一个命令&#xff0c;Makefile是一个文件&#xff0c;Makefile中包含了依赖关系和依赖方法。 从上面的文件以及指令中我们可以看到&#xff0c;我们可以在Makefile文件中写入依赖关系以及对应的依赖方法&…

2024执业医师考试报名流程及上传照片要求详解

2024年执业医师和助理医师考试的报名工作将于1月22日正式启动&#xff0c;报名截止日期为2月4日。建议考生尽早报名&#xff0c;以避免在报名截止日期临近时出现拥挤情况。您可根据本文介绍&#xff0c;提前准备好报名所需资料、证件照电子版和相关证明材料&#xff0c;并了解报…

【我与Java的成长记】之多态,重载与重写详解

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 Java笔记传送门 &#x1f31f; 个人主页&#xff1a;古德猫宁- &#x1f308; 信念如阳光&#xff0c;照亮前行的每一步 文章目录 系列文章目录&#x1f308; *信念如阳光&#xff0c;照亮前行的每一步* 前言一、多态的概…

米贸搜|Facebook新手请查收!如何在FB上定位到B类受众?

一、确定目标受众和营销目标 在利用Facebook进行获客之前&#xff0c;B2B企业需要首先明确目标受众和营销目标。目标受众是指潜在的客户或合作伙伴&#xff0c;而营销目标可能是增加销量、提高品牌知名度、获取客户线索等。 Facebook的受众定位可以分成三大类&#xff1a;人口…

Netty通信中的粘包半包问题(五)

这期我们来分析下消息头消息体的这种方式来实现完美的解决方案&#xff0c;当然这也是最复杂的一种实现&#xff0c;因为在大多数场景中&#xff0c;性能和复杂度始终不能兼得。代码中使用了MessagePack的第三方序列化&#xff0c;因为我们要传输的实体类对象在客户端和服务端之…
最新文章