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 和下标ifor (int i = 0; i < nums1.length; i++) {map.put(nums1[i], i);}int[] nums1Result = new int[nums1.length];// 保存Nums1每一个元素右侧第一个比其大的元素value// 初始化value为-1Arrays.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.hqwc.cn/news/422897.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android】TypedArray的使用

介绍 看电池电量组件BatteryMeterView的时候看到的。 Array是个数组&#xff0c;所有TypedArray也是个容器&#xff0c;基本是用于自定义View里面的&#xff08;至少我目前见过的全部都在自定义View里面&#xff09;。 使用 1.自定义View public class RoundSeekbarView e…

陪玩系统:最新商业版游戏陪玩语音聊天系统3.0商业升级独立版本源码

首发价值29800元的最新商业版游戏陪玩语音聊天系统3.0商业升级独立版本源码 &#xff08;价值29800&#xff09;最新陪玩3.0独立版本 &#xff0c;文件截图 结尾将会附上此系统源码以及详细搭建教程包含素材图仅用于学习使用 陪玩系统3.0独立升级版正式发布&#xff0c;此版本…

计算机视觉的应用

计算机视觉&#xff08;Computer Vision&#xff09;是一门研究如何让计算机能够理解和分析数字图像或视频的学科。简单来说&#xff0c;计算机视觉的目标是让计算机能够像人类一样对视觉信息进行处理和理解。为实现这个目标&#xff0c;计算机视觉结合了图像处理、机器学习、模…

【立创EDA-PCB设计基础】5.布线设计规则设置

前言&#xff1a;本文详解布线前的设计规则设置。经过本专栏中的【立创EDA-PCB设计基础】前几节已经完成了布局&#xff0c;接下来开始进行布线&#xff0c;在布线之前&#xff0c;要设置设计规则。 目录 1.间距设置 1.1 安全间距设置 1.2 其它间距设置 2.物理设置 2.1 导…

工业相机+镜头选型及靶面、焦距计算等相关详解

工业相机镜头选型及靶面、焦距计算等相关详解 着重讲述相机的各个参数及使用意义总结相机镜头选型主要参数的推理计算 0. 工业相机相关概念简介 相机与镜头一览 工业相机与镜头实物图如下图所示&#xff1a; 常见的相机有两种供电方式&#xff1a;一种是电源线供电&#xff0…

137基于matlab的面和线接触的滑块润滑

基于matlab的面和线接触的滑块润滑&#xff0c;基于有限差分法求解面接触滑块润滑的油膜厚度、油膜压力&#xff0c;输出三维可视化结果。程序已调通&#xff0c;可直接运行。 137 matlab油膜压力油膜厚度 (xiaohongshu.com)

【代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串】

代码随想录算法训练营第二十七天|39. 组合总和、40.组合总和II、131.分割回文串 39. 组合总和40.组合总和II131.分割回文串 题解参考y总的&#xff1a;http://www.acwing.com 39. 组合总和 我是一看就会&#xff0c;一写就废。先看代码&#xff1a; class Solution { public:…

云计算任务调度仿真05

今天再分享一个新的调度框架deeprm 本项目基于hongzimao/deeprm&#xff0c;原作者还著有论文Resource Management with Deep Reinforcement Learning 。 这个框架研究的也蛮多的&#xff0c;我在一篇博士论文中也看到了基于此的研究工作&#xff0c;但是论文题目忘记了。 运…

知识表示与推理:智能的核心

目录 前言1 知识的多重表达形式2 知识表示的本质3 知识表示的五个重要用途3.1 人可理解3.2 实体标识3.3 概念模型3.4 推理3.5 易于计算 4 知识的离散符号表示5 知识的连续向量表示结语 前言 人类心智的独特之处在于其具备获取、表示和处理知识的能力。这一本质特征体现在多个领…

jdk17新特性——Switch表达式增强

目录 一、Switch表达式增强示例一1.1、传统的方式 case中变量赋值示例1.2、jdk17 case中变量赋值示例 二、Switch表达式增强示例二2.1、传统的方式 case中值匹配多个示例2.2、jdk17 case中值匹配多个示例 三、Switch表达式增强示例三3.1、传统的方式 case中需要多行业务代码示例…

使用vue-pdf插件加载pdf

安装&#xff1a; // 安装这个版本&#xff0c;其它版本会有千奇百怪的错&#xff0c;这个版本和4.0.0都是可以的 cnpm install vue-pdf4.2.0// 安装pdfjs-dist cnpm install pdfjs-dist2.5.207 使用&#xff1a; // 我的css样式是pxToRem&#xff0c;友友们使用可能样式会有…

Nginx查看并发连接数

前言 需要依赖于nginx的http_stub_status_module模块http://nginx.org/en/docs/ 查看是否已经安装此模块 windows: linux: 添加/status 在server段内&#xff0c;添加如下配置&#xff1a; server {listen 80;server_name localhost;root "D:/WWW/local…