【LeetCode热题100】--739.每日温度

news2024/10/6 12:21:14

739.每日温度

image-20231014111030703

方法:单调栈

可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。

正向遍历温度列表。对于温度列表中的每个元素 temperatures[i],如果栈为空,则直接将 i 进栈,如果栈不为空,则比较栈顶元素 prevIndex 对应的温度 temperatures[prevIndex] 和当前温度 temperatures[i],如果 temperatures[i] > temperatures[prevIndex],则将 prevIndex 移除,并将 prevIndex 对应的等待天数赋为 i - prevIndex,重复上述操作直到栈为空或者栈顶元素对应的温度小于等于当前温度,然后将 i 进栈。

为什么可以在弹栈的时候更新 ans[prevIndex] 呢?因为在这种情况下,即将进栈的 i 对应的 temperatures[i] 一定是 temperatures[prevIndex] 右边第一个比它大的元素,试想如果 prevIndex 和 i 有比它大的元素,假设下标为 j,那么 prevIndex 一定会在下标 j 的那一轮被弹掉。

由于单调栈满足从栈底到栈顶元素对应的温度递减,因此每次有元素进栈时,会将温度更低的元素全部移除,并更新出栈元素对应的等待天数,这样可以确保等待天数一定是最小的。

以下用一个具体的例子帮助读者理解单调栈。对于温度列表 [73,74,75,71,69,72,76,73],单调栈 stack的初始状态为空,答案 ans的初始状态是 [0,0,0,0,0,0,0,0],按照以下步骤更新单调栈和答案,其中单调栈内的元素都是下标,括号内的数字表示下标在温度列表中对应的温度。

  • 当 i=0 时,单调栈为空,因此将 0进栈。

    • stack=[0(73)]
    • ans=[0,0,0,0,0,0,0,0]
  • 当 i=1 时,由于 74大于 73,因此移除栈顶元素 0,赋值 ans[0]:=1−0,将 1 进栈。

    • stack=[1(74)]
    • ans=[1,0,0,0,0,0,0,0]
  • 当 i=2 时,由于 75 大于 74,因此移除栈顶元素 1,赋值 ans[1]:=2−1,将2 进栈

    • stack=[2(75)]
    • ans=[1,1,0,0,0,0,0,0]
  • 当 i=3 时,由于 71小于 75,因此将3 进栈。

    • stack=[2(75),3(71)]
    • ans=[1,1,0,0,0,0,0,0]
  • 当 i=4 时,由于 69小于 71,因此将 4 进栈。

    • stack=[2(75),3(71),4(69)]
    • ans=[1,1,0,0,0,0,0,0]
  • 当 i=5 时,由于 72大于 69 和 71,因此依次移除栈顶元素 4 和 3,赋值 ans[4]:=5−4 和 ans[3]:=5−3,将 5 进栈。

    • stack=[2(75),5(72)]
    • ans=[1,1,0,2,1,0,0,0]
  • 当 i=6 时,由于 76大于 72和 75,因此依次移除栈顶元素 5 和 2,赋值 ans[5]:=6−5 和 ans[2]:=6−2,将 6进栈。

    • stack=[6(76)]
    • ans=[1,1,4,2,1,1,0,0]
  • 当 i=7 时,由于 73 小于 76,因此将 7 进栈。

    • stack=[6(76),7(73)]
    • ans=[1,1,4,2,1,1,0,0]
class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int length = temperatures.length;
        int[] ans = new int[length];
        Deque<Integer> stack = new LinkedList<Integer>();
        for(int i = 0;i < length;i++){
            int temperature = temperatures[i];
            while(!stack.isEmpty() && temperature > temperatures[stack.peek()]){
                int prevIndex = stack.pop();
                ans[prevIndex] = i - prevIndex;
            }
            stack.push(i);
        }
        return ans;
    }
}

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

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

相关文章

YOLOv5算法改进(11)— 主干网络介绍(MobileNetV3、ShuffleNetV2和GhostNet)

前言:Hello大家好,我是小哥谈。主干网络通常指的是深度学习中的主干模型,通常由多个卷积层和池化层组成,用于提取输入数据的特征。在训练过程中,主干网络的参数会被不断优化以提高模型的准确性。YOLOv5算法中的主干网络可以有多种替换方案,为了后面讲解的方便,本篇文章就…

C结构体内定义结构体,不能直接赋值。

现像&#xff1a; 如下代码&#xff1a; 头文件&#xff1a; typedef struct aBlinkGpioPinOutAbst_{void (*initAsOutput)(void);void (*high)(void);void (*low)(void); }aBlinkGpioPinOutAbst;typedef struct aBlinkGpioAbst_{ #if GPIO_CONFIG_PA0 GPIO_CONFIG_AS_OUTPU…

Jetson Orin NX 开发指南(9): MAVROS 的安装、配置与运行

一、前言 由于 Jetson 系列开发板常作为自主无人机的机载电脑&#xff0c;而无人机硬件平台如 PX4 和 ArduPilot 等通过 MAVLink 进行发布无人机状态和位姿等信息&#xff0c;要实现机载电脑与 MAVLink 的通信&#xff0c;必须借助 Mavros 功能包&#xff0c;因此&#xff0c;…

分页机制详解

分页机制详解 《操作系统真象还原》第五章笔记 内存不足&#xff0c;需要分页机制 我们所写的代码仅仅是完成了某件事的一部分而已&#xff0c;也许是大部分&#xff0c;还有一部分是 CPU 硬件上负责的&#xff0c;这部分咱们不用管&#xff0c;由 CPU 自动完成。比如&#x…

内网渗透——隧道代理

文章目录 代理代理使用场景VPS建立隧道frpMSF木马生成监听开启frp服务端和客户端执行exe木马文件 代理 实验环境&#xff1a; 攻击机kali&#xff1a;192.168.188.133&#xff08;NAT模式&#xff09; 模拟的公网服务器&#xff08;本机&#xff09;&#xff1a;10.9.75.239 …

Python学习基础笔记六十八——循环

循环是编程语言常见的流程控制。 Python语句要让计算机反复地做一些事情&#xff0c;就要用到循环语句。 有While和for循环。 while循环&#xff1a; command input("请输入命令:") while command ! exit:print(f输入的命令是{command})command input("请输…

15. Java反射和注解

Java —— 反射和注解 1. 反射2. 注解 1. 反射 动态语言&#xff1a;变量的类型和属性可以在运行时动态确定&#xff0c;而不需要在编译时指定 常见动态语言&#xff1a;Python&#xff0c;JavaScript&#xff0c;Ruby&#xff0c;PHP&#xff0c;Perl&#xff1b;常见静态语言…

SAP报错CX_SY DYN CALL PARAM MISSING

DYN CALL METH PARAM MISSING CX_SY DYN CALL PARAM MISSING 在 ABAP 中&#xff0c;当你定义一个方法时&#xff0c;可以选择将方法的参数标记为可选&#xff08;可选参数&#xff09;或必需&#xff08;必需参数&#xff09;。如果你不勾选可选参数选项&#xff0c;那么该参…

【AI视野·今日Sound 声学论文速览 第二十五期】Fri, 13 Oct 2023

AI视野今日CS.Sound 声学论文速览 Fri, 13 Oct 2023 Totally 8 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Impact of time and note duration tokenizations on deep learning symbolic music modeling Authors Nathan Fradet, Nicolas Gutowski,…

Sentinel-2 命名规则(Naming Convention)

下述命名规则是2019年12月6日颁布的&#xff0c;自此之后的L1C级别产品都按照这个规则命名&#xff08;其他级别的产品官网没说&#xff09;。 下载下来的文件是个zip&#xff0c;解压后是个与zip同名的 .SAFE 文件。 MMM_MSIXXX_YYYYMMDDHHMMSS_Nxxyy_ROOO_Tnnmab_<Produ…

Modelsim查看波形窗口内断言(SVA)消息指示器

步骤1&#xff1a;创建工程并编译完成 在相应目录下创建好工程并编译无错误后&#xff1b; 步骤二&#xff1a; 在菜单栏中选择“Simulate”—>“Start Simulation”—>“Others”,在“Others Vsim Options”中输入 -msgmode both -displaymsgmode both 步骤三&#xf…

Leetcode——数组的改变、移动练习

453. 最小操作次数使数组元素相等 本人答案超时 class Solution { public:int minMoves(vector<int>& nums) {int len nums.size();int count 0;if (len 1) {count 0;}else {while (nums[0] ! nums[1] || nums[len - 2] ! nums[len - 1]) {for (int i 0; i <…

搭建一个vscode+uni+vue的小程序项目

我们使用 vue2 创建工程作为示例&#xff0c;uni-app中Vue2版的组件库和插件也比较多&#xff0c;稳定、问题少&#xff0c;可以先参考下官方文档:uni-app官网 既然是使用vue脚手架&#xff0c;那肯定要全局安装vue/cli&#xff0c;已安装的可以跳过。 注意&#xff1a;Vue2创…

面试题-React(十二):React中不可变数据的力量

一、不可变数据的概念 不可变数据意味着数据一旦创建&#xff0c;就不能被更改。在React中&#xff0c;每次对数据的修改都会返回一个新的数据副本&#xff0c;而不会改变原始数据。这种方式确保了数据的稳定性和一致性。 二、Props中的不可变数据 在React中&#xff0c;组件…

【数据结构】:二叉树与堆排序的实现

1.树概念及结构(了解) 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的有一个特殊的结点&#…

湖南省人才档案查询

湖南省人才档案查询 微信中查询智慧人社公众号 进入智慧人社公众号&#xff0c;点击智慧人社按钮 点击人才档案查询 查看档案信息

chapter8 Dimensionality Reduction(降维)

设置 首先&#xff0c;确保代码在python2和python3中都能正常工作&#xff0c;导入一些通用模块&#xff0c;确保MatplotLib以内联方式绘制图形&#xff0c;并准备一个函数来保存这些图形: from __future__ import division,print_function,unicode_literalsimport numpy as …

异星工场入门笔记-01

两年前玩过一点&#xff0c;不看教程&#xff0c;单纯地开放世界自己探索&#xff0c;没有同类游戏经验&#xff0c;因此很难有获得感所以放弃了。现在正版游戏涨到130&#xff0c;看在逆势上涨的份上&#xff0c;我倒想继续探索下这个游戏的价值。 玩魔方&#xff0c;记教程步…

深度学习之使用CSDN的InsCode的服务器

CSDN开启了一个InsCode的栏目&#xff0c;在里面可以部署自己的项目&#xff0c;同时可以租赁GPU服务器&#xff1a; 由于博主在CSDN有些积蓄&#xff0c;因此便来测评一下&#xff0c;博主购买了3090这个型号 接下来便是登录使用了&#xff0c;博主使用的是Mobaxterm这个软件&…