代码随想录刷题Day58 | 739. 每日温度 | 496. 下一个更大元素 I

news2024/12/28 18:28:56

代码随想录刷题Day58 | 739. 每日温度 | 496. 下一个更大元素 I

739. 每日温度

题目:

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

示例 1:

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

思路:

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

  1. 单调栈里存放的元素是什么?

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

  1. 单调栈里元素是递增呢? 还是递减呢?

注意一下顺序为 从栈头到栈底的顺序,因为单纯的说从左到右或者从前到后,不说栈头朝哪个方向的话,大家一定会越看越懵。

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

文字描述理解起来有点费劲,接下来我画了一系列的图,来讲解单调栈的工作过程。

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

  • 当前遍历的元素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]。

首先先将第一个遍历元素加入单调栈 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7bxonroS-1670474740165)(https://dum1615.oss-cn-chengdu.aliyuncs.com/20210219124434172.jpg)]

加入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]。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4NyGXmrz-1670474740165)(https://dum1615.oss-cn-chengdu.aliyuncs.com/20210219124504299.jpg)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qT5wL02Q-1670474740166)(https://dum1615.oss-cn-chengdu.aliyuncs.com/20210219124527361.jpg)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VXV1UTn-1670474740166)(https://dum1615.oss-cn-chengdu.aliyuncs.com/20210219124610761.jpg)]

加入T[4],T[4] == T[3] (当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况),此时依然要加入栈,不用计算距离,因为我们要求的是右面第一个大于本元素的位置,而不是大于等于! [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PtLIszAP-1670474740166)(https://dum1615.oss-cn-chengdu.aliyuncs.com/20210219124633444.jpg)]

加入T[5],T[5] > T[4] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[4]弹出,同时计算距离,更新result 739.每日温度6

T[4]弹出之后, T[5] > T[3] (当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况),将T[3]继续弹出,同时计算距离,更新result 739.每日温度7

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

加入T[6],同理,需要将栈里的T[5],T[2]弹出 739.每日温度9

同理,继续弹出 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c9INmTsG-1670474740168)(https://dum1615.oss-cn-chengdu.aliyuncs.com/2021021912490098.jpg)]

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

739.每日温度11

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

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

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

代码:

class Solution {
    public int[] dailyTemperatures(int[] tem) {
        //单调栈
        Stack<Integer> s = new Stack<>();
        int[] ans = new int[tem.length];
        for(int i = 0; i < tem.length; i++){
            if(s.empty() || tem[i] <= tem[s.peek()]){
                s.push(i);
                continue;
            }
            while(!s.empty() && tem[i] > tem[s.peek()]){
                int index = s.pop();
                ans[index] = i - index;
            }
            s.push(i);
        }
        return ans;
    }
}

496. 下一个更大元素 I

题目:

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

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

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

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

示例 1:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。

思路:

同上题每日温度

代码:

class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < nums2.length; i++){
            map.put(nums2[i], -1);
        }
        Stack<Integer> s = new Stack<>();
        for(int i = 0; i < nums2.length; i++){
            if(s.empty() || nums2[i] <= nums2[s.peek()]){
                s.push(i);
                continue;
            }
            while(!s.empty() && nums2[i] > nums2[s.peek()]){
                int index = s.pop();
                map.put(nums2[index], nums2[i]);
            }
            s.push(i);
        }
        int[] ans = new int[nums1.length];
        for(int i = 0; i < nums1.length; i++){
            ans[i] = map.get(nums1[i]);
        }
        return ans;
    }
}

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

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

相关文章

剑指Offer51——数组中的逆序对

摘要 剑指 Offer 51. 数组中的逆序对 一、暴力的方法 1.1 暴力的解析 使用两层 for 循环枚举所有的数对&#xff0c;逐一判断是否构成逆序关系。 1.2 复杂度分析 时间复杂度&#xff1a;O(N^2)&#xff0c;这里N是数组的长度&#xff1b;空间复杂度&#xff1a;O(1)。 1…

【芯片应用】PA93

文章目录一、简介二、原理1、外部连接&#xff08;1&#xff09;相位补偿&#xff08;2&#xff09;限流电阻一、简介 性质&#xff1a;高压运算放大器 厂商&#xff1a;美国 APEX Microtechnology公司 供电电压&#xff1a;Vs to -Vs&#xff1a;最高400V&#xff0c;即200V …

【web课程设计】HTML+CSS仿QQ音乐网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【Windows基础】NTFS文件系统

NTFS文件系统 windows上的文件系统 早期Windows上使用&#xff1a;FAT16或FAT32&#xff08;Windows98&#xff09;目前Windows操作系统基本使用的是NTFS文件系统ReFS文件系统 ReFS&#xff08;Resilient File System&#xff0c;复原文件系统&#xff09;是在 Windows Serve…

万众期待的Dyson Zone空气净化耳机确认将于中国首发,戴森重新定义“好声音”

同享纯净音质与洁净空气&#xff0c;Dyson Zone™ 空气净化耳机确认将在中国开启全球首发 中国&#xff0c; 2022年12月8日 – 今日&#xff0c;戴森首次公开了Dyson Zone™ 空气净化耳机的详细技术参数&#xff0c;该产品已确认将在中国开启全球首发&#xff0c;并在戴森指定…

玩好.NET高级调试,你也要会写点汇编

一&#xff1a;背景 1. 简介 .NET 高级调试要想玩的好&#xff0c;看懂汇编是基本功&#xff0c;但看懂汇编和能写点汇编又完全是两回事&#xff0c;所以有时候看的多&#xff0c;总手痒痒想写一点&#xff0c;在 Windows 平台上搭建汇编环境不是那么容易&#xff0c;大多还是…

[附源码]Python计算机毕业设计SSM佳音大学志愿填报系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Mybatis日志配置(slf4j、log4j、log4j2)

文章目录1. Mybatis日志1.1 日志实现原理1.2 日志实现方式2. SLF4J2.1 slf4j日志级别2.2 日志门面与日志实现2.3 日志门面与日志依赖配置3. LOG4J3.1 日志级别3.2 log4j重要组件3.3 mybatis日志配置log4j3. LOG4J23.1 mybatis配置log4j23.2 log4j2配置文件1. Mybatis日志 1.1 …

elasticsearch集群数据索引迁移自动化脚本

日常维护elasticsearch集群会出现新老集群数据迁移,这里使用的是snapshot api是Elasticsearch用于对数据进行备份和恢复的一组api接口,可以通过snapshot api进行跨集群的数据迁移,原理就是从源ES集群创建数据快照,然后在目标ES集群中进行恢复。 1、新老集群修改集群配置文…

潦草手写体也能轻松识别,快速提取文字不用愁

基于文本识别&#xff08;OCR&#xff09;技术的成熟与应用&#xff0c;日常生活中的大部分“印刷体识别”需求都能被满足&#xff0c;替代了人工信息录入与检测等操作&#xff0c;大大降低输入成本。 而对于复杂的手写体识别需求&#xff0c;业界识别质量却参差不齐。大部分手…

【Linux】进程优先级进程切换

索引➡️进程优先级1.什么叫做优先级2.为什么会存在优先级3.看看Linux怎么做的4.查看进程优先级的命令&#x1f60a;进程的一些特性➡️进程切换➡️进程优先级 1.什么叫做优先级 优先级和权限有些区别&#xff0c;权限决定能还是不能&#xff0c;优先级的前提是能&#xff0…

计算机存储器之逻辑地址和物理地址转换详解

文章目录1 概述2 转换2.1 逻辑地址 to 物理地址2.2 物理地址 to 逻辑地址3 扩展3.1 在线进制转换1 概述 #mermaid-svg-zTbJ3rKuirwBssRU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zTbJ3rKuirwBssRU .error-ico…

Zookeeper-全面详解(学习总结---从入门到深化)

目录 Zookeeper概念_集中式到分布式 单机架构 集群架构 什么是分布式 三者区别 Zookeeper概念_CAP定理 分区容错性 一致性 可用性 一致性和可用性的矛盾 Zookeeper概念_什么是Zookeeper 分布式架构 Zookeeper从何而来 Zookeeper介绍 Zookeeper概念_应用场景 数据发布/订阅 实…

vue框架常用的组件库:Element、vant4地址

这些组件库也只能解决UI问题&#xff0c;真正的业务还需要自己去写 pc端&#xff1a;Element&#xff1a;Element - The worlds most popular Vue UI frameworkElement&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库https://element.eleme.io…

【成都信息工程大学】2022-807C语言程序设计

&#xff08;因为考研时间将近&#xff0c;所以没有将其书写的形式展示&#xff0c;这字稍微有点丑&#xff0c;请见谅&#xff01;&#xff01;&#xff09; 算法流程图&#xff1a;先叙述程序设计思想&#xff0c;再画出程序流程图&#xff0c;不需要给出代码。 1.选择排序…

python教程:12种列表常用操作方法

都是基础知识&#xff0c;长久不用就会忘&#xff0c;温故知新&#xff0c;又来学习学习。相信很多人在编程的或者对一些程序处理的思维会用到&#xff0c;比如面试 &#xff08;有写的不对的地方也请大家指正&#xff5e; 一、列表定义 列表是一个有序且可更改的集合。在Pyth…

计算机视觉之单发多框检测(Single Shot MultiBox Detector)模型《3》

有了前面两节的背景知识&#xff0c;我们来构造一个目标检测模型&#xff0c;就是来自Wei Liu大神之作的SSD了&#xff0c;有兴趣的可以查阅论文&#xff1a;SSD: Single Shot MultiBox Detector 计算机视觉之目标检测(object detection)《1》https://blog.csdn.net/weixin_41…

[附源码]Python计算机毕业设计Django招聘系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

C#语言实例源码系列-实现图片合成功能

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

关于质量分析

背景 在日常工作过程中&#xff0c;作为测试&#xff0c;我们要及时反思总结历史出现的问题&#xff0c;以便于对日常的工作流程规范以及质量防护措施作出相应的调整作为下属&#xff0c;我们要定期的向上级反馈近期的产品质量情况基于以上的背景&#xff0c;我们需要定期对产…