算法力扣刷题记录 九十【739. 每日温度】

news2024/9/22 13:25:18

前言

单调栈第一篇。单调栈解题思路如何?


一、题目阅读

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

示例 1:

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

示例 2:

输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:

输入: temperatures = [30,60,90]
输出: [1,1,0]

提示:

1 <= temperatures.length <= 10^5
30 <= temperatures[i] <= 100

二、思路

【739. 每日温度】 参考学习链接

  1. 暴力两层for循环。第一层固定起始下标,内层for循环找第一个比它大的数值的下标,做减法。

    class Solution {
    public:
        vector<int> dailyTemperatures(vector<int>& temperatures) {
            vector<int> result(temperatures.size(),0);//初始化0
            for(int i = 0;i <temperatures.size();i++){
                for(int j = i+1;j < temperatures.size();j++){
                    if(temperatures[j] <= temperatures [i]) continue;
                    result[i] = j-i;
                    break;//找到第一个大的数值,就可以break本层循环
                }
            }
            return result;
        }
    };
    

    时间复杂度是O(n2),提交后超出时间限制。存在用例无法通过。

  2. 一维数组,寻找任一个元素的 右边或者左边 第一个 比自己大或者小的元素的位置,就要想到用单调栈。 时间复杂度为O(n)

  3. 本题求:该元素右边第一个比它大的元素的位置,获得距离。所以用单调栈解决。那么这个栈维护的是什么元素? 栈中始终保持递增或者递减

  • 栈中放元素所在的下标。获得元素就通过数组temperature[i]。
  • 结论:从栈口到栈底 递增——求当前元素的右边/左边第一个比自己大的元素(的位置);递减——求当前元素的右边/左边第一个比自己小的元素(的位置)
  • 原数组遍历顺序 结论:
    • 如果求当前元素的右边第一个比自己大/小的元素,那么从0到size-1;因为栈里放已经遍历过的元素,当前的元素在已经遍历过的元素的右边;
    • 如果求当前元素的左边第一个比自己大/小的元素,那么从size-1到0;因为栈里放已经遍历过的元素,当前的元素在已经遍历过的元素的左边;
  • 栈的作用:记录已经遍历过哪些元素。和当前遍历的元素比较,才知道当前的元素有没有比之前的元素大/小
  1. 过程:记录结果的数组(即返回值),每一个结果的顺序不是依次确定的,可能跳跃性的确定。
    在这里插入图片描述
    在这里插入图片描述
  2. 总结:
  • 单调栈中放下标
  • 当前元素 > 栈顶元素:记录结果、pop元素、循环判断直至栈顶元素不大于当前元素、并放入当前元素;
  • 当前元素 == 栈顶元素:直接放入。
  • 当前元素 < 栈顶元素:直接放入。

三、代码实现【单调栈】

3.1 根据思路个人实现

时间复杂度O(N).

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        vector<int> result(temperatures.size(),0);//初始化0
        stack<int> st;
        if(!temperatures.empty()) st.push(0);//先放入下标0
        for(int i = 1;i < temperatures.size();i++){
            while(!st.empty() && temperatures[i] > temperatures[st.top()]){//当前元素temperature[i]大于栈顶元素
                result[st.top()] = i - st.top();
                st.pop();
            }
            st.push(i);//直接放入,要么栈已经空或者当前元素小于等于栈顶元素
        }
        return result;
    }
};

参考代码:第一个版本如下,上面是精简版本。

// 版本一
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        // 递增栈
        stack<int> st;
        vector<int> result(T.size(), 0);
        st.push(0);
        for (int i = 1; i < T.size(); i++) {
            if (T[i] < T[st.top()]) {                       // 情况一
                st.push(i);
            } else if (T[i] == T[st.top()]) {               // 情况二
                st.push(i);
            } else {
                while (!st.empty() && T[i] > T[st.top()]) { // 情况三
                    result[st.top()] = i - st.top();
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
};

四、举一反三

1.

总结

在这里插入图片描述
(欢迎指正,转载标明出处)

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

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

相关文章

2024 Python3.10 系统入门+进阶(十):Python字典及其常用操作详解

目录 一、初始化1.1 {}--直接创建字典1.2 dict()函数--创建字典1.3 fromkeys()方法--创建一个新字典 二、元素访问2.1 使用中括号[]语法2.2 get()方法--获取字典中指定键的值2.3 setdefault()方法--获取字典中指定键的值 三、新增和修改3.1 直接赋值3.2 update()方法--更新字典…

RabbitMQ练习(Routing)

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考&#xff1a;《RabbitMQ练习&#xff08;Hello World&#xff09;》和《RabbitMQ练习&#xff08;Work Queues&#xff09;》。 确保RabbitMQ、Sender、Receiver、Receiver2容器…

人工智能训练师一级(高级技师)、二级(技师)考试指南

随着经济快速发展&#xff0c;人工智能技术在制造业、交通运输、农业、医疗健康、金融服务、物流配送以及城市服务等多个领域得到了广泛的应用。不仅带来产业的转型升级&#xff0c;更是对具备相应技能的人工智能训练师需求的激增。 根据教育部发布的《关于做好职业教育“…

BugKu练习记录:把猪困在猪圈里

题目&#xff1a; 用base64解码 再对应猪圈密码解码&#xff0c;得到答案 t h i s i s p i g p a s s w o r d

house of pig

文章目录 house of pig介绍&#xff1a;利用条件&#xff1a;利用流程&#xff1a; 例题&#xff1a;利用&#xff1a; 总结&#xff1a; house of pig 介绍&#xff1a; House of Pig 是一个将 Tcache Stash Unlink Attack 和 FSOP 结合的攻击&#xff0c;同时使用到了 Larg…

MQ专题:事务消息的实现方式

方案 事务消息投递的过程 step1&#xff1a;开启本地事务step2&#xff1a;执行本地业务step3&#xff1a;消息表t_msg写入记录&#xff0c;status为0&#xff08;待投递到MQ&#xff09;step4&#xff1a;提交本地事务step5&#xff1a;若事务提交成功&#xff0c;则投递消息…

【原创教程】电气电工13:按钮开关指示灯篇

按钮开关在电气电工工作中,看似简单,但是有些细节问题,我们还是要注意的。电气电工工作是一个完整的体系,任何一件事疏忽,都会埋下安全隐患。 首先我们来看下 开关按钮的定义: 按钮开关是指利用按钮推动传动机构,使动触点与静触点按通或断开并实现电路换接的开关。按…

软件测试面试题!收藏起来,每天看一看,月薪20K!

初级测试总结题&#xff01;必背&#xff01;必背&#xff01;必背&#xff01; 1&#xff09;软件的概念&#xff1f; 软件是计算机系统中与硬件相互依存的一部分&#xff0c;包括程序、数据以及与其相关文档的完整集合。 2&#xff09;软件测试的概念&#xff1f; 使用人…

讲透一个强大的算法模型,Transformer

Transformer 模型是一种基于注意力机制的深度学习模型&#xff0c;广泛应用于自然语言处理&#xff08;NLP&#xff09;任务&#xff0c;如机器翻译、文本生成和语义理解。 它最初由 Vaswani 等人在2017年的论文《Attention is All You Need》中提出。它突破了传统序列模型&am…

搬运5款实用工具,帮你更好地完成各种任务

​ 在日常工作和生活中&#xff0c;使用各种工具来提升效率和简化任务变得尤为重要。本文将介绍几款实用的工具&#xff0c;帮助你更好地完成各种任务。 1. 自动化脚本——AutoHotkey ​ AutoHotkey是一款功能强大的自动化脚本编写工具&#xff0c;可以用来自动执行日常任务&…

【网络安全】漏洞挖掘

漏洞描述 Spring框架为现代基于java的企业应用程序(在任何类型的部署平台上)提供了一个全面的编程和配置模型。 Spring Cloud 中的 serveless框架 Spring Cloud Function 中的 RoutingFunction 类的 apply 方法将请求头中的“spring.cloud.function.routing-expression”参数…

餐饮_零售_麻辣烫_水果店_零食店_生鲜店等收银系统

介绍 多商户多门店的Sass收银系统。适用于餐饮_零售_麻辣烫_水果店_零食店_生鲜店等收银系统&#xff0c;包含windows收银pos端、商家小程序管理端、商家运营端、电子会员、电子小票 软件架构 收银Pos&#xff1a;vue2、node、electron、sqlite、antd 后端服务&#xff1a;spri…

【如何用本机的Navicat远程连接到ubuntu服务器上的mysql】

文章目录 版本一、ubuntu服务器安装mysql5二、远程连接——mysql配置1.创建新mysql用户2.修改配置文件3.查看端口是否开启 三、远程连接——Navicat 版本 mysql:5.7.32 服务器&#xff1a;ubuntu20.04 PC:win10 一、ubuntu服务器安装mysql5 因为ubuntu20.04默认mysql其实是my…

Windows超好用的命令行工具--Cmder 赶紧把cmd丢了吧!

简介 Cmder 是一个现代化的命令行工具可以智能提示&#xff0c;高亮显示文件夹… 1. 官网地址&#xff1a;Cmder下载地址 2. 滑倒最下面可以看到以下按钮 3. 解压到自己想要保存的地址&#xff08;⚠️记住这个路径&#xff09; 比如我解压到了C:\Cmder\Cmder.exe(⚠️不推…

变天了!24岁硕士年薪50万元,博士年薪200万起!人才缺口100万

从上海交大硕士毕业的00后表示&#xff0c;“24岁硕士毕业时年薪50万元&#xff0c;到了30岁大概能升到P7(注&#xff1a;职级名称&#xff09;&#xff0c;那时就能年薪百万了。” 他今年入职腾讯&#xff0c;担任AI算法工程师&#xff0c;成为AI风口下第一批就业的年轻人。 …

CUDA 内核函数

文章目录 一、简介二、实现代码三、实现效果参考资料 一、简介 CUDA为我们提供了可扩展的编程模型&#xff1a;它的核心是三个关键的抽象——线程组的层次结构、共享内存和阻塞同步——它们只是作为一组最小的语言扩展暴露给外部使用人员。这些抽象提供细粒度数据并行性和线程并…

MyBatis的学习————上篇

目录 一、MyBatis简介 1、MyBatis的历史 2、MyBatis的特性 3、和其它持久化层技术的比较 二、搭建MyBatis 1、开发环境 ​编辑2、创建Maven工程 3、创建MyBatis核心配置文件 4、创建mapper接口 5、创建Mybatis的映射文件 6、测试功能 7、功能优化 8、修改和删除方…

重生奇迹MU最合适PK的几个职业

重生奇迹MU是一款备受玩家青睐的经典游戏&#xff0c;其中的PK系统更是吸引了众多玩家的关注。在众多职业中&#xff0c;哪些职业最适合PK呢&#xff1f; PK作为重生奇迹MU的一种娱乐方式&#xff0c;已成为该游戏核心系统之一&#xff0c;并在多年的流行中仍能带给玩家许多乐…

python正则表达式的一些问题

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Matplotlib中twinx() 函数的用法

ax1.twinx() 是 Matplotlib 库中的一个函数&#xff0c;用于在同一个图中创建一个共享 x 轴但具有独立 y 轴的双 y 轴图表。这个函数非常适合用来在同一张图中绘制两组具有不同 y 轴度量的变量&#xff0c;使得它们可以共享 x 轴&#xff0c;但彼此之间有不同的 y 轴尺度。 ax…