代码随想录58——单调栈:739每日温度、 496下一个更大元素I

news2024/9/22 19:19:36

文章目录

  • 1.739每日温度
    • 1.1.题目
    • 1.2.解答
      • 1.2.1.单调栈使用情况
      • 1.2.2.本题解答
  • 2. 496下一个更大元素I
    • 2.1.题目
    • 2.2.解答

1.739每日温度

参考:代码随想录,739每日温度;力扣题目链接

1.1.题目

在这里插入图片描述

1.2.解答

1.2.1.单调栈使用情况

首先想到的当然是暴力解法,两层for循环,把至少需要等待的天数就搜出来了。时间复杂度是O(n^2)

那么接下来在来看看使用单调栈的解法。

那什么时候用单调栈呢

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

例如本题其实就是找找到一个元素右边第一个比自己大的元素。此时就应该想到用单调栈了。

1.2.2.本题解答

那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?

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

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

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

  • 单调栈里元素是递增呢? 还是递减呢?
    假设栈的开口向右,则单调栈里的元素需要从左向右递减

后面关于单调栈工作原理的绘图直接去看代码随想录中的图就可以了,因为图比较多,这里就不直接给出了。

注意:这里主要理解一下单调栈的工作原理,实际上和汉诺塔非常相似

  • 所谓单调栈,也就是栈中维护的都是单调的值,从栈底到栈顶要么单调递增, 要么单调递减,这里以本题的单调递减为例;
  • 新来了一个数之后,就判断它是否比栈顶的数小(或等),如果满足则可以入栈,这样仍然满足单调递减的栈的要求。如果不满足,则就要出栈,在出栈的过程中,我们就在计算最终的结果

最后给出代码如下,其实思路很简单,但是也非常巧妙,轻易不容易想到。

vector<int> dailyTemperatures(vector<int> &temperatures)
{
    stack<int> st;       // 定义单调栈,存储每个元素的索引
    vector<int> result(temperatures.size(), 0);  // 存储结果,初始化成0 
    st.push(0);   // 先存入第一个数

    // 遍历所有元素,根据大小判断是否要加入单调栈中
    for(int i = 1; i < temperatures.size(); i++)
    {
        // 1.如果当前元素 < 栈顶元素,则入栈
        if(temperatures[i] < temperatures[st.top()])
            st.push(i);
        // 2.如果当前元素 = 栈顶元素,则入栈
        else if(temperatures[i] == temperatures[st.top()])
            st.push(i);  
        // 3.如果当前元素 > 栈顶元素,开始出栈
        else 
        {
            while(!st.empty() && temperatures[i] > temperatures[st.top()])
            {
                // 计算结果,看右边是第几个数比当前的数大。这里也可以发现为什么单调栈中
                // 存储的是元素的索引,而不是元素的值,因为我们这里就要通过索引来计算有
                // 几个数,如果存储元素值的话虽然可以用于比较大小,但是无法计算有几个数
                result[st.top()] = i - st.top();    
                st.pop();   // 弹出
            }
            // 运行到这里,说明当前元素可以入栈,入栈后仍然是单调栈
            st.push(i);
        }
    }

    // 最后返回结果
    return result;
}

2. 496下一个更大元素I

参考:代码随想录,496下一个更大元素I;力扣题目链接

2.1.题目

在这里插入图片描述

2.2.解答

其实这道题目和上一道题目几乎是一样的。我们把nums2就看成是上一题中给的数组,然后计算nums2中每个元素的右边第一个大于它的数。但是和上一题不同是,这里需要计算的是nums1 中的数值,其实这个时候只需要在num2中的数出栈的时候判断要出栈的数是否在num1中即可,如果在的话就存储结果,如果不在则直接出栈即可,不需要存储结果。

另外一个小的trick是,本题求得是数,而不是索引,所以在栈中直接存数值就可以了。

给出代码如下,其实思路非常简单,和上面的题目几乎一样。

vector<int> nextGreaterElement(vector<int> &nums1, vector<int> &nums2)
{
	// 1.定义变量
	stack<int> st;   // 单调栈,这里直接存数据就可以了
	vector<int> result(nums1.size(), -1);   // 最终结果,初始化成-1   
	
	// 2.记录nums1的数据和对应的索引,方便后面查找。因为使用单调栈之后给结果
	//   赋值的时候不一定是按照从前向后的顺序赋值的,所以这里要记录元素对应的索引
	unordered_map<int, int> umap;
	for(int i = 0; i < nums1.size(); i++)
	    umap[nums1[i]] = i;
	
	st.push(nums2[0]);   // 先把nums2的第一个数加入
	// 3.遍历nums2,用单调栈求右边第一个大于当前数的数据
	for(int i = 1; i < nums2.size(); i++)
	{
	    // (1)如果满足单调栈的要求,则入栈
	    if(nums2[i] <= st.top())
	        st.push(nums2[i]);
	    // (2)否则不满足要求,则不断出栈,出栈过程中收集结果
	    else 
	    {
	        while(!st.empty() && nums2[i] > st.top())
	        {
	            // 如果栈顶的数是nums1中的数,则可以收集结果
	            if(umap.find(st.top()) != umap.end())
	            {
	                result[umap[st.top()]] = nums2[i];
	            }
	            st.pop();   // 不管是否收集结果,都要出栈
	        }
	        // 运行到这里,则当前数字可以入栈
	        st.push(nums2[i]);
	    }
	}
	
	// 最后返回结果
	return result;
}

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

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

相关文章

通过STM32Cube配置完成基于I2C协议的AHT20温湿度传感器的数据采集

文章目录前言一、I2C协议1、应用2、组成3、软件I2C和硬件I2C3.1软件I2C3.2硬件I2C二、通过硬件I2C协议采集AHT20的数据1、配置项目2、配置代码三、效果四、总结五、参考资料前言 硬件&#xff1a;stm32f103c8t6 核心板软件&#xff1a;STM32CubeMX 6.4.0软件&#xff1a;keil5…

java常见集合框架的区别

1.说说有哪些常见集合&#xff1f; 集合相关类和接口都在java.util中&#xff0c;主要分为3种&#xff1a;List&#xff08;列表&#xff09;、Map&#xff08;映射&#xff09;、Set(集)。 Java集合主要关系 其中Collection是集合List、Set的父接口&#xff0c;它主要有两个子…

澳大利亚博士后招聘|国立大学—太阳能电池方向

【国外博士后招聘-知识人网】澳大利亚国立大学博士后—太阳能电池方向 澳大利亚国立大学&#xff08;The Australian National University&#xff09;&#xff0c;简称ANU&#xff0c;始建于1946年&#xff0c;坐落于澳大利亚首都堪培拉&#xff0c;是公立研究型综合类大学&am…

Ernie-SimCSE对比学习在内容反作弊上应用

作者 | ANTI 导读 AI技术在不同行业和业务被广泛的应用&#xff0c;本文介绍了反作弊团队在与spammer对抗愈演愈烈的趋势下&#xff0c;不断探索前沿技术&#xff0c;将百度NLP预训练模型结合对比学习用于解决spam内容中知道提问群发推广作弊的技术方案。 本次分享&#xff0c;…

从单车智能到车路协同,均胜电子正在加快智能驾驶商业化进程

进入2022年&#xff0c;自动驾驶迈入了商业化的关键期&#xff0c;但市场分层也开始越来越明显。 一方面&#xff0c;L2级及以上智能辅助驾驶的搭载量在不断攀升&#xff0c;未来将成为量产车的标准配置。根据《高工智能汽车研究院》数据显示&#xff0c;今年1-9月前装标配搭载…

基于python的停车场管理系统的设计与实现/智能停车管理系统

摘要 车位信息是停车场供应用户必不可少的一个部分。在停车场发展的整个过程中&#xff0c;车位信息担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类系统管理程序也在不断改进。本课题所设计的停车场管理系统&#xff0c;使用Django框架&#xff0c;Python语…

Linux学习-37-查看文件系统硬盘信息(df、du命令)

10.2 df用法详解&#xff1a;查看文件系统硬盘使用情况 Linux 磁盘管理好坏直接关系到整个系统的性能问题。df &#xff08;disk free&#xff09;命令&#xff0c;检查文件系统的磁盘空间占用情况&#xff0c;包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量等。 …

[附源码]Python计算机毕业设计bugbase管理系统

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

Div3 cf1741

Cf1741 文章目录A. Compare T-Shirt SizesB. Funny Permutation&#xff08;思维&#xff09;C. Minimize the Thickness&#xff08;&#xff09;A. Compare T-Shirt Sizes 题意: 第一行&#xff0c;输入测试样例个数n&#xff0c;接下来n行输入 &#xff0c;输入a和b代表衣服…

【自然语言处理(NLP)】基于注意力机制的英文新闻标题生成

【自然语言处理&#xff08;NLP&#xff09;】基于注意力机制的英文新闻标题生成 作者简介&#xff1a;在校大学生一枚&#xff0c;华为云享专家&#xff0c;阿里云专家博主&#xff0c;腾云先锋&#xff08;TDP&#xff09;成员&#xff0c;云曦智划项目总负责人&#xff0c;全…

SpringBoot+Vue项目宠物猫店管理系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JDK版…

[附源码]java毕业设计篮球俱乐部管理系统

项目运行 环境配置&#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…

Flume部署实验

目录一、实验介绍1.1实验内容1.2实验知识点1.3实验环境1.4实验资源1.5实验步骤清单二、实训架构三、实验环境准备四、实验步骤4.1Flume部署4.1.1配置hosts文件及zookeeper的myid4.1.2安装Flume4.1.3验证Flume五、实验总结一、实验介绍 1.1实验内容 本实验包括分布式海量日志采…

Axure 学习:简单的下拉菜单为什么做不好?

​很多同学在学习axure的时候&#xff0c;总是会发现有的时候明明看起来很简单的内容&#xff0c;却怎么也做不好&#xff0c;总是会出现这样或那样的问题。 原因是细节。有的同学没有注意到细节&#xff0c;忽略了&#xff0c;造成做好的内容总是存在一些小问题。本文以一个交…

【FLASH存储器系列十】ONFI数据接口的时序参数与时序图

目录 1.1 时序参数 1.2 时序图详解 1.2.1命令锁存时序 1.2.2地址锁存时序 1.2.3数据输入时序 1.2.4数据输出时序 1.2.5数据输出时序&#xff08;EDO&#xff09; 1.2.6读状态时序 1.1 时序参数 ONFI协议中明确规定了时序参数的范围&#xff0c;如果不满足要求的最小和最…

赞奇科技英特尔共图视觉计算“云”上大作为

作为物理世界与虚拟世界 “数实交融” 的重要桥梁&#xff0c;视觉计算已经成为建筑设计、VR/AR、互动游戏、影视动漫、工业设计等行业领域赖以发展的关键计算形式&#xff0c;通过图像初始略图、三维重建等方式&#xff0c;将事物与场景特征以图片、视频等视觉方式表现出来&am…

Nginx高可用

在生产环境上很多时候是以Nginx做反向代理对外提供服务&#xff0c;但是Nginx难免遇见故障&#xff0c;如&#xff1a;服务器宕机。当Nginx宕机那么所有对外提供的接口都将导致无法访问。因此需要两台以上的Nginx服务器对外提供服务&#xff0c;这样的话就可以解决其中一台宕机…

再探Kotlin 跨平台——迁移Paging分页库至KMM

前言 KMM的发展除了靠官方社区的支持外&#xff0c;一些大企业的开源落地也尤为重要。从这些开源中我们需要借鉴他的设计思想和实现方式。从而在落地遇到问题时&#xff0c;寻得更多的解决办法。 上周&#xff0c;Square正式将Paging分页库迁移到了Kotlin Multiplatform平台&…

目标检测论文解读复现之十:基于YOLOv5的遥感图像目标检测

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

接上篇文章,完成Hadoop集群部署实验

这里写目录标题一、实验介绍1.1 实验内容1.2 实验知识点1.3 实验环境1.4 实验资源1.5 实验步骤清单二、实验架构三、实验环境准备四、实验步骤4.1 查看环境4.2部署Hadoop集群4.2.1安装hadoop(master)4.2.2创建hdfs数据文件存储目录(master)4.2.3修改配置文件(master)4.2.4主从节…