当前位置: 首页 > news >正文

【算法练习Day49】每日温度下一个更大元素 I

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 每日温度
  • 下一个更大元素 I
  • 总结:

每日温度

739. 每日温度 - 力扣(LeetCode)

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

单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。

更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。

在使用单调栈的时候首先要明确如下几点:

单调栈里存放的元素是什么?
单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。

单调栈里元素是递增呢? 还是递减呢?
这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,栈里要加入一个元素i的时候,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。

即:如果求一个元素右边第一个更大元素,单调栈就是递增的,如果求一个元素右边第一个更小元素,单调栈就是递减的。

使用单调栈主要有三个判断条件。

当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况

把这三种情况分析清楚了,也就理解透彻了。

class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] result = new int[temperatures.length];Arrays.fill(result, 0);Stack<Integer> st = new Stack<>();st.push(0);for (int i = 1; i < temperatures.length; i++) {if (temperatures[i] <= temperatures[st.peek()]) {st.push(i);} else {while (!st.isEmpty()&&temperatures[i] > temperatures[st.peek()]) {result[st.peek()] = i - st.pop();}st.push(i);}}return result;}
}

下一个更大元素 I

496. 下一个更大元素 I - 力扣(LeetCode)

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

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

这么定义这个result数组初始化应该为多少呢?

题目说如果不存在对应位置就输出 -1 ,所以result数组如果某位置没有被赋值,那么就应该是是-1,所以就初始化为-1。

在遍历nums2的过程中,我们要判断nums2[i]是否在nums1中出现过,因为最后是要根据nums1元素的下标来更新result数组。

注意题目中说是两个没有重复元素 的数组 nums1 和 nums2。

没有重复元素,我们就可以用map来做映射了。根据数值快速找到下标,还可以判断nums2[i]是否在nums1中出现过。

栈头到栈底的顺序,要从小到大,也就是保持栈里的元素为递增顺序。只要保持递增,才能找到右边第一个比自己大的元素。

可能这里有一些同学不理解,那么可以自己尝试一下用递减栈,能不能求出来。其实递减栈就是求右边第一个比自己小的元素了。

接下来就要分析如下三种情况,一定要分析清楚。

情况一:当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
此时满足递增栈(栈头到栈底的顺序),所以直接入栈。

情况二:当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
如果相等的话,依然直接入栈,因为我们要求的是右边第一个比自己大的元素,而不是大于等于!

情况三:当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
此时如果入栈就不满足递增栈了,这也是找到右边第一个比自己大的元素的时候。

判断栈顶元素是否在nums1里出现过,(注意栈里的元素是nums2的元素),如果出现过,开始记录结果。

class Solution {public static int[] nextGreaterElement(int[] nums1, int[] nums2) {Stack<Integer> st= new Stack<>();HashMap<Integer, Integer> map= new HashMap<>();int[] result= new int[nums1.length];for (int i = 0; i < nums2.length; i++) {map.put(nums2[i], -1);}st.push(0);for (int i = 1; i < nums2.length; i++) {while (!st.isEmpty()&&nums2[i]>nums2[st.peek()]){map.put(nums2[st.pop()],nums2[i]);}st.push(i);}for (int i = 0; i <nums1.length; i++) {result[i]= map.get(nums1[i]);}return result;}
}

总结:

今天我们完成了每日温度、下一个更大元素 I两道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

http://www.lryc.cn/news/230744.html

相关文章:

  • Maven打包时跳过测试代码
  • 2023-2024 年适用于 Windows 电脑的顶级视频录制软件
  • 2023-11-14 mysql-主从复制-重置主从连接-记录
  • go语言学习之旅之安装sdk环境,hello world!
  • 《Linux从练气到飞升》No.28 Linux中的线程同步
  • 爬取动态网页内容的库
  • Ubuntu 安装常见问题
  • 大数据分析师职业技能提升好考吗?含金量高不高
  • JumpServer2023漏洞复现合集
  • 【Linux】Ubuntu16.04配置repo
  • uniapp小程序更新逻辑,按实际开发为主
  • 骨传导蓝牙耳机哪款好?这五款骨传导耳机闭眼入都不会错!
  • 数据库操作入门:PyMongo 和 MongoDB 的基本用法
  • 开发企业微信群机器人,实现定时提醒
  • 剑指 Offer 06. 从尾到头打印链表
  • 深度学习之基于Pytorch服装图像分类识别系统
  • 串口通讯:
  • 批量重命名软件推荐 A Better Finder Rename 12最新 for mac
  • 【2013年数据结构真题】
  • csrf学习笔记总结
  • 【kafka】windows安装启动
  • redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
  • 《白帽子讲web安全》笔记
  • unity UGUI无限循环滚动居中
  • 人工智能与新能源电动车的融合——技术创新引领未来交通革命
  • 交换机堆叠 配置(H3C)堆叠中一台故障如何替换
  • 2024年软考有哪些考试科目?具体考什么内容?
  • 2023.11.12 hive中分区表,分桶表与区别概念
  • Pass-中间件管理
  • 什么是GIL锁,有什么作用?python的垃圾回收机制是什么样的?解释为什么计算密集型用多进程,io密集型用多线程。