【刷题之路】单调栈秒解每日温度

news2024/12/26 6:56:44

一、题目描述

原题链接:https://leetcode.cn/problems/daily-temperatures/

题目描述:

给定一个整数数组 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.栈顶向栈底数据递增是求下一个更大元素,栈顶向栈底递减是求下一个更小元素
  • 2.单调栈的作用是记录遍历过的元素,然后与当前遍历的元素进行比较,最后再对遍历过的元素(栈内元素)进行操作

注意:这里我们往栈里存储的是下标,如果需要使用对应的元素,直接T[i]就可以获取。如果要修改对应的值,也可以通过下标找到对应位置。

  •  注意弹出的时候应该是当前遍历元素不断和栈内元素进行比较,所以这里应该要有一个循环,直到循环结束后,再将当前遍历元素入栈
  • 题目要求如果气温在这之后都不会升高,请在该位置用 0 来代替。所以遍历结束后还留在栈内的就是不会再升高的温度了,我们不对其进行任何操作,在开辟数组的时候将数组元素初始化为0即可
  • 开辟数组的时候应该使用malloc,而不是int,因为这是在函数接口内,局部变量会在调用结束后被销毁

代码实现

首先我们来cv一下c语言手撕的栈

 typedef int STDataType;
typedef struct Stack
{
	int top;
	int capacity;
	STDataType* a;
}ST;

void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);
STDataType StackTop(ST* ps);//获得栈顶元素
int StackSize(ST* ps);
bool StackEmpty(ST* ps);

void StackInit(ST* ps)
{
	assert(ps);

	ps->capacity = ps->top = 0;//指向最后一个数据的下一个
	ps->a = NULL;
}

bool StackEmpty(ST* ps)
{
	assert(ps);

	return ps->top == 0;
}
void StackPush(ST* ps, STDataType x)
{
	assert(ps);

	//当内存满了则需要扩容
	if (ps->top == ps->capacity)
	{
		int newcapacity = (ps->capacity == 0) ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, newcapacity);
		if (tmp == NULL)
		{
			perror("malloc fail\n");
			return;
		}
		else
		{
			ps->capacity = newcapacity;
			ps->a = tmp;
		}
	}
	//没满就直接压栈即可
	ps->a[ps->top] = x;
	ps->top++;
}
void StackPop(ST* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	ps->top--;
}
STDataType StackTop(ST* ps)//获得栈顶元素
{
	assert(ps);
	assert(!StackEmpty(ps));

	return ps->a[ps->top - 1];
}
void StackDestroy(ST* ps)
{
	assert(ps);

	free(ps->a);

	ps->a = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

以下为题解

int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize){
    //数组初始化
    int* result = (int*)malloc(sizeof(int) * temperaturesSize);
    for(int i=0;i<temperaturesSize;i++)
    {
         result[i]=0;
    }
    ST st;
     StackInit(&st);
    *returnSize = temperaturesSize;
    StackPush(&st, 0);
    for (int i = 1;i < temperaturesSize;i++)
    {
        //小于等于栈顶元素直接入栈
        if (temperatures[i] <= temperatures[StackTop(&st)])
        {
            StackPush(&st, i);
        }
        else
        {
            //当前遍历元素大于栈顶元素,将遍历元素减去栈顶元素后放入数组里,直到栈为空
            while (!StackEmpty(&st) && temperatures[i] > temperatures[StackTop(&st)])
            {
                //后-前
                result[StackTop(&st)] = i - StackTop(&st);
                 StackPop(&st);
             }
            StackPush(&st, i);
        }
    }
    return result;  
}

三、总结

本道题目为单调栈裸题,还有不少的变形题。

希望大家能仔细体会单调栈的用法以及原理,然后再去突破其他几道单调栈的题目

下一个更大元素I

下一个更大元素II

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

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

相关文章

【JVM】什么是双亲委派机制?

一、为什么会有这种机制&#xff1f; 类加载器将.class类加载到内存中时&#xff0c;为了避免重复加载&#xff08;确保Class对象的唯一性&#xff09;以及JVM的安全性&#xff0c;需要使用某一种方式来实现只加载一次&#xff0c;加载过就不能被修改或再次加载。 二、什么是双…

docker安装 sqlserver2017 或者 2008

一、必要条件 服务器的运行内存必须大于2GB 二、拉取2017镜像 docker pull mcr.microsoft.com/mssql/server:2017-latest三、启动镜像 docker run --name sqlserver2017 --restart always -v /home/ceshi1:/var/opt/mssql -d -e ACCEPT_EULAY -e SA_PASSWORDqwer!#123 -…

C语言参悟-运算符表达式和语句

C语言参悟-运算符表达式和语句 一、概述二、运算符0. 运算符分类1. 数学运算符2. 逻辑运算符3. 二进制运算符4. 便捷运算符 三、表达式四、语句 一、概述 在我刚开始学C语言的时候&#xff0c;语句和运算符号这些对我来说还是很陌生的。 现在来看我对于这个的理解其实就是一种…

AUTOSAR架构介绍

简介 AUTOSAR&#xff08;AUTomotive Open System ARchitecture&#xff09;是一种面向汽车电子系统的软件架构标准。AUTOSAR为汽车电子系统提供一种开放式的软件架构标准&#xff0c;以促进汽车电子系统的可重用性、互操作性和可扩展性。它包括一系列的规范和标准&#xff0c…

Force Dimension 全系列触觉反馈装置

力觉或触觉是人体感官中具有双向传递信息能力的信息载体。借助于力反馈&#xff0c;人们可以真实的按照人类的肢体语言进行人机自然互动和信息交流&#xff0c;用户通过应用力反馈&#xff0c;可以获得和触摸实际物体时相同的运动感&#xff0c;从而产生更真实的沉浸感。 力反馈…

毕业遭失业,前途一片黑暗...不得已转行软件测试,太多心酸和无助...

大家好&#xff0c;我叫小涵&#xff0c;一名应届毕业生&#xff0c;目前已经成功转行互联网。写这篇文章的目的是因为很多人不喜欢自己的现状&#xff0c;想通过学习改变&#xff0c;奈何没有出路&#xff0c;所以想为这部分人提供一些思路&#xff1b;其次文章会总结我自己转…

汽车电子设计之SBC芯片

参考英飞凌SBC官网资料&#xff1a;https://www.infineon.com/cms/cn/product/automotive-system-ic/system-basis-chips-sbc/ SBC芯片在汽车电子领域可谓占一席之地了。那么什么是SBC&#xff1f;怎么用&#xff1f;用在哪里&#xff1f;主要特性&#xff1f; 目录 1.什么是…

unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,

今天调试和服务器连接&#xff0c;发现始终获取不到服务器的数据&#xff0c; 电脑和服务器都在同一局域网&#xff0c;仍然获取不到&#xff0c; 下面是电脑环境配置&#xff0c; 第一步&#xff1a; 设置网络为专用网络&#xff0c;然后点击配置防火墙和安全设置&#xff0c;…

Unity——2D小游戏笔记整理

【每日一句&#xff1a;清晨和夜晚都请用尽全力去生活】 目录 一、环境搭建 二、人物 三、相机跟随人物移动 四、平铺精灵 五、血条跟随敌人行走 六、脚本逻辑 【玩家行走方法】 【玩家跳跃方法】 【改变玩家血量值方法】 【创建玩家子弹方法】 【主角血量&#xff…

《计算机网络——自顶向下方法》精炼——3.7(1)

少而好学,如日出之阳;壮而好学,如日中之光;志而好学,如炳烛之光。——刘向 文章目录 拥塞控制方法ATM ABR拥塞控制 TCP拥塞控制TCP拥塞控制算法的实现慢启动拥塞避免快速恢复总结 拥塞控制方法 在上一篇文章中&#xff0c;我们介绍了在数据传输过程中出现的问题。本节将简要介…

Bitbucket 的SSH keys 突然无法识别 -> Permission denied (publickey)问题

Bitbucket 的SSH keys 突然无法识别 -> Permission denied (publickey)问题 用了几年的SSH keys突然出现Permission denied (publickey)问题&#xff0c;如下图所示&#xff1a; 1、首先排查项目权限问题&#xff0c;确认其他账号可更新代码&#xff0c;排除 2、排除SSH k…

【软件测试】白盒测试与黑盒测试

白盒测试与黑盒测试 测试用例定义生成的基本准测设计步骤作用测试数据和测试用例的区别 黑盒测试定义优点缺点黑盒测试的实施过程等价类划分法边界值分析法错误推测法因果图判定表判定表例题 白盒测试介绍覆盖程度基本路径覆盖程序流程图简化成控制流图计算圈复杂度导出测试用例…

chatGPT 学习笔记

学习笔记&#xff1a;chatGPT chatGPT 概述 什么是 chatGPT &#xff1f;(要说明定义、来源、功能和特点) ChatGPT 是 OpenAI 开发的一个大型预训练语言模型&#xff0c;它基于 GPT-3.5 模型&#xff0c;可以在对话中生成类似人类的文本响应&#xff0c;简称对齐。它使用自监…

基于节点分层的配网潮流前推回代方法【IEEE33节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

java的UDP(一)

文章目录 1. 简介2. UDP客户端3. UDP服务器4. DatagramPacket类 1. 简介 Java中的UDP实现分为两个类&#xff1a;DatagramPacket和DatagramSocket。DatagramPacket类将数据字节填充到UDP包汇总&#xff0c;这称为数据报&#xff0c;由你来解包接收的数据报。DatagramSocket可以…

2023北京大学首席营销官CMO高级研修班简介

【课程背景】自 2022 年以来&#xff0c;营销新趋势呈现以下变化&#xff1a;消费渠道多元化&#xff0c;社会化媒体 成为信息主要渠道&#xff0c;流量红利消失&#xff0c;数字营销成当下主流&#xff1a;元宇宙数字营销成热点&#xff1b;私域运营更受品牌重视&#xff1b;国…

MySQL主存复制

介绍 配置-主库master 第一步&#xff1a;修改MySQL数据库的配置文件/etc/my.cnf [mysqld] log-binmysql-bin #[必须]启用二进制日志 server-id100 #[必须]服务器唯一id第二部&#xff1a;重启MySQL服务 systemctl restart mysqld第三步&#xff1a;登录MySQL操作&#x…

Talk预告 | 新加坡国立大学张傲:10%成本定制类 GPT-4 多模态大模型

本期为TechBeat人工智能社区第502期线上Talk&#xff01; 北京时间06月01日(周四)20:00&#xff0c;新加坡国立大学在读博士生 — 张傲的Talk将准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “10%成本定制类 GPT-4 多模态大模型 ”&#xff0c;届时将介…

RemoteSensing投稿流程

RemoteSensing投稿流程&#xff0c;底部有官网地址和word模板 RemoteSensing投稿流程&#xff0c;遇到的坑RemoteSensing期刊官网地址&#xff0c;模板 RemoteSensing投稿流程&#xff0c; ##3.16 Submit &#xff08;第一次提交&#xff09; 3.17 Under review &#xff08;正…

中核浦原一号数字员工诞生,实在智能为智能制造再添强大引擎

头戴博士帽&#xff0c;脚踩喷气引擎&#xff0c;身披“科技蓝”披风&#xff0c;今年的全国科技工作者日&#xff0c;一位硬“核”数字员工正式诞生&#xff01; 这就是由上海中核八所科技有限公司&#xff08;下称中核八所&#xff09;人工智能研发中心为上海中核浦原有限公司…