【刷题之路Ⅱ】LeetCode 739. 每日温度

news2025/7/15 13:56:36

【刷题之路Ⅱ】LeetCode 739. 每日温度

  • 一、题目描述
  • 二、解题
    • 1、方法1——暴力法
      • 1.1、思路分析
      • 1.2、代码实现
    • 2、方法2——单调栈
      • 2.1、思路分析
      • 2.2、先将栈实现一下
      • 2.3、代码实现

一、题目描述

原题连接: 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]

示例 2:

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

示例 3:

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

提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100

二、解题

1、方法1——暴力法

1.1、思路分析

大家应该最容易想到的就是暴力法,对于每一个temperatures[i],我们都令j == i + 1 开始查找,只要找到一个temperatures[j] > temperatures[i]我们就可以退出,并记录j - i进一个答案数组。

1.2、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) {
    assert(temperatures && returnSize);
    *returnSize = temperaturesSize;
    int *answer = (int*)malloc(temperaturesSize * sizeof(int));
    if (NULL == answer) {
        perror("malloc fail!\n");
        exit(-2);
    }
    memset(answer, 0, temperaturesSize * sizeof(int));
    int i = 0;
    int j = 0;
    for (i = 0; i < temperaturesSize - 1; i++) {
        for (j = i + 1; j < temperaturesSize; j++) {
            if ( temperatures[j] > temperatures[i]) {
                answer[i] = j - i;
                break;
            }
        }
    }
    return answer;
}

// 时间复杂度:O(n^2),n即为数组长度。
// 空间复杂度:O(n),我们需要n个整型空间来存储答案数组,故空间复杂度为O(n)。
(只不过这种复杂度在LeetCode上是过不了的)

2、方法2——单调栈

2.1、思路分析

可能做过496. 下一个更大元素 I的朋友们就会发现这两题是这么的相似。
确实,这两题同样是往右边找更大的元素,只不过这一题相比于496题来说更简便一些,因为这一题只是在一个数组中查找,而496题却是要两个数组中查找。
所以这一题当然也能用496题的单调栈的思路,但相比于496题这题的单调栈的思路就会更简单一点,因为496题涉及到两个数组,所以496题还需要借助哈希表来映射,但这一题就只需要一个栈即可。

接下来看思路:
我们可以创建一个存储下标的栈,然后顺序遍历数组,当栈为空时,就将遍历到的元素的下标入栈:
在这里插入图片描述
(括号内为对应的温度)
而当遍历到的温度小于栈顶温度时,就将当前遍历到的下标压入栈中:
在这里插入图片描述
所以如果栈中有所个下标,那么这些下标对应的温度一定是自顶向下递增的:
在这里插入图片描述
这也正是为什么这个方法称之为“单调栈”的原因。

而当遍历到的温度大于栈顶下标对应的温度时,我们需要连续地将栈顶下标取出,记为index,连续的当前遍历到的温度是否大于index所对应的温度,如果大于就将栈顶下标弹出栈,并将答案数组的answer[index]赋值为i - index。
重复上述操作直到,当前遍历到的温度不在大于栈顶温度或者栈为空。最后再将当前遍历到的温度的下标入栈:
在这里插入图片描述
这样但我们遍历完了数组,我们的答案也就出来了。

2.2、先将栈实现一下

先将栈CV一下:

// 重定义数据类型
typedef int DataType;

// 定义栈结构
typedef struct stack {
	DataType* data;
	int top;
	int capacity;
} Stack;

// 栈的初始化
void StackInit(Stack* ps);

// 压栈
void StackPush(Stack* ps, DataType x);
// 弹栈
void StackPop(Stack* ps);
// 返回栈顶数据
DataType StackTop(Stack* ps);
// 返回栈的数据个数
int StackSize(Stack* ps);
// 判断栈是否为空
bool StackEmpty(Stack* ps);
// 栈的销毁
void DestroyStack(Stack* ps);

// 栈的初始化
void StackInit(Stack* ps) {
	assert(ps);
	ps->data = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

// 压栈
void StackPush(Stack* ps, DataType x) {
	assert(ps);
	// 检查是否需要增容
	if (ps->top == ps->capacity) {
		int newCapacity = ps->capacity == 0 ? 10 : ps->capacity * 2;
		DataType* temp = (DataType*)realloc(ps->data, newCapacity * sizeof(DataType));
		if (NULL == temp) {
			perror("ralloc fail!\n");
			exit(-1);
		}
		ps->data = temp;
		ps->capacity = newCapacity;
	}
	ps->data[ps->top] = x;
	ps->top++;
}

// 弹栈
void StackPop(Stack* ps) {
	assert(ps);
	assert(ps->top > 0);
	ps->top--;
}

// 返回栈顶数据
DataType StackTop(Stack* ps) {
	assert(ps);
	assert(!StackEmpty(ps));
	return ps->data[ps->top - 1];
}

// 返回栈的数据个数
int StackSize(Stack* ps) {
	assert(ps);
	assert(ps->top >= 0);
	return ps->top;
}

// 判断栈是否为空
bool StackEmpty(Stack* ps) {
	assert(ps);
	return ps->top == 0;
}

// 栈的销毁
void DestroyStack(Stack* ps) {
	assert(ps);
	free(ps->data);
	ps->data = NULL;
	ps->top = 0;
	ps->capacity = 0;
}

2.3、代码实现

有了以上思路,那我们写起代码来也就水到渠成了:

int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) {
    assert(temperatures && returnSize);
    *returnSize = temperaturesSize;
    int i = 0;
    int *answer = (int*)malloc(temperaturesSize * sizeof(int));
    if (NULL == answer) {
        perror("malloc fail!\n");
        exit(-1);
    }
    memset(answer, 0, temperaturesSize * sizeof(int));
    Stack stack;
    StackInit(&stack);
    int index = 0;
    for (i = 0; i < temperaturesSize; i++) {
        if (!StackEmpty(&stack)) {
            index = StackTop(&stack);
        }
        if (StackEmpty(&stack)) {
            StackPush(&stack, i);
        } else if (temperatures[i] > temperatures[index]) {
            while (!StackEmpty(&stack)) {
                index = StackTop(&stack);
                if (temperatures[i] > temperatures[index]) {
                    answer[index] = i - index;
                    StackPop(&stack);
                } else {
                    break;
                }
            }
            StackPush(&stack, i);
        } else {
            StackPush(&stack, i);
        }
    }
    DestroyStack(&stack);
    return answer;
}

时间复杂度:O(n),n为数组长度,我们需要顺序遍历一遍数组,而每一个下标最多也只有一次出栈和进栈的机会,故总的时间复杂度还是O(n)。
空间复杂度:O(n),最坏情况下,n - 1个温度都会累积在栈中,故空间复杂度为O(n)。

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

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

相关文章

ChatGPT 使用 拓展资料:吴恩达大咖 基于LangChain的LLM应用程序开发-1

ChatGPT 使用 拓展资料:吴恩达大咖 基于LangChain的LLM应用程序开发 基于LangChain的LLM应用程序开发 LangChain for LLM Application Development [https://www.deeplearning.ai/short-courses/langchain-for-llm-application-development/] 基于LangChain的LLM应用程序开发…

干货|SpringCloud之注册中心如何选用

SpringCloud的框架并不陌生了&#xff0c;在业内微服务领域的扛把子。今天来看一看如何根据业务需要&#xff0c;来选择合适的注册中心&#xff1f; 注册中心是微服务管理节点通信、核心配置的关键组件&#xff0c;从分布式多节点的前提下最主要要解决是就是分布式下的一致性问…

教你领取免费的亚马逊云服务服务器并搭建服务器环境的方法教程

本篇文章主要讲解&#xff0c;亚马逊新用户注册领取亚马逊免费服务器的详细操作流程方法,以及如何规避免费服务器到期后自动续费的问题解决办法。 作者&#xff1a;任聪聪 日期&#xff1a;2023年6月2日 前提材料准备 1.需要先准备好你的亚马逊账号注册所需的手机号、邮箱、vi…

18-Vue3中一些新的组件

目录 1、Fragment2、Teleport3、Suspense 1、Fragment 在Vue2中: 组件必须有一个根标签在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中好处: 减少标签层级, 减小内存占用 2、Teleport 什么是Teleport&#xff1f;—— Teleport 是一种能够将我…

一个开源的基于golang开发的企业级物联网平台

SagooIOT是一个基于golang开发的开源的企业级物联网基础开发平台。负责设备管理和协议数据管理&#xff0c;支持跨平台的物联网接入及管理方案&#xff0c;平台实现了物联网开发相关的基础功能&#xff0c;基于该功能可以快速的搭建起一整套的IOT相关的业务系统。旨在通过可复用…

测试4年,费时8个月,入职阿里,涨薪14K,可算是熬出头了····

前言 你的努力&#xff0c;终将成就无可替代的自己 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事功能测试&#xff08;所谓的点点点&#xff09;的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;…

java打jar包并包装成exe解压即用

1首先找到要加载的main方法类 public static void main(String[] args) { //创建该对象则调用构造方法&#xff0c;对象实现ActionListener则自动调用actionPerformed&#xff08;&#xff09;方法new PicdealMain();}2.点击 idea&#xff1a;File->Project Struce…(快捷键…

MyBatis深入学习总结(1.0)

MyBatis总结 MyBatis入门操作 简介 原始jdbc操作&#xff08;查询数据&#xff09; 原始jdbc操作&#xff08;插入数据&#xff09; 原始jdbc操作的分析 原始jdbbc开发存在的问题如下&#xff1a; 数据库连接创建、释放频繁造成系统资源的浪费从而影响系统性能sql语句在代…

3年经验,面试测试开发岗25K都拿不到了吗?这么坑?

最近后台读者说自己最近在疯狂投简历&#xff0c;有的石沉大海&#xff0c;但还好不是全军覆没。前两天好不容易熬到了阿里的四面&#xff0c;跟我聊了一下&#xff0c;面试官拿哪些题为难了他&#xff1f; 前面几题还好&#xff0c;问的是有关JVM的一些问题&#xff0c;比如说…

一道Java经典面试题 99%都有可能做错

前言 最近在面试中遇到一个关于位运算的题目 如下图 请问这个aString打印值是多少 学过位运算我们都知道 9<<4位 用2进制表示就是0000 1001 如果按照我之前的算法就是 0000 10001 向左位运算4 得到 1001 0000 这个时候我们得到的值就是 12816 144 拿到144这个值我们再…

session.upload_progress文件包含漏洞

session.upload_progress文件包含漏洞 前言 之前学习了该漏洞&#xff0c;但是没有做笔记&#xff0c;导致容易遗忘。在此用一个题目来理解session.upload_progress漏洞 基础知识 session存储 我们在phpinfo可以看到session的存储路径&#xff1a; 以下是一些session在lin…

【Python文本处理】基于运动路线记录GPX的文件解析,GPX转SRT字幕文件(不需要安装三方库)

【Python文本处理】基于运动路线记录GPX的文件解析&#xff0c;GPX转SRT字幕文件&#xff08;不需要安装三方库&#xff09; 解析和转换 GPX文件格式 GPX文件本身其实就是坐标、海拔、时间、心率等综合性的xml文件 如图&#xff1a; 海拔&#xff1a;ele 时间&#xff1a;t…

【GTest】使用CMakeLitsts.txt构建Windows和Linux的跨平台GoogleTest项目(非常详细+亲测有效)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、…

00): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)

好久没有使用数据库&#xff0c; 连接数据库报上面的错误&#xff0c;尝试了网上的方法还是没有成功&#xff0c;思索之后想起之前手动关闭了mysql的服务&#xff0c;Windows启动时mysql服务不会自动启动&#xff0c;成功启动mysql服务后再次连接数据库&#xff0c;正常连接。 …

keil 使用问题总结

1. 编译报错 1.1 …\USER\stm32f10x.h(428): error: #67: expected a “}” ADC1_2_IRQn 18, /*!< ADC1 and ADC2 global Interrupt */*** Using Compiler V5.06 update 4 (build 422), folder: D:\keil_v537\install\ARM\ARM…

滴滴和华为5年,分享一下真实的划水经验....

先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;17 年毕业加入华为&#xff0c;之后跳槽到了滴滴&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成了一次晋升&#xff0c;换了一家公司&#xff0c;有…

朋友圈九宫格照片怎么做?一键图片分割

相信朋友们都看过这样发朋友圈的方式&#xff0c;一张图片发出九宫格的效果&#xff1a; 或者是在各大社交平台、引流平台&#xff0c;这种发图的方法已经屡见不鲜了&#xff0c;可当自己上网搜【图片分割】、【宫格切图】等等&#xff0c;要么就是要注册账号登录才能操作&…

大数据---聚类分析概述及聚类评估

聚类概述: 什么是聚类&#xff1f; 是把数据对象集合按照相似性划分成多个子集的过程。每个子集是一个簇&#xff08;cluster&#xff09;&#xff0c;分类的最终效果&#xff1a;使得簇中的对象彼此相似&#xff0c;但与其他簇中的对象相异。聚类是无监督学习&#xff0c;因…

ses价签墨水屏折腾-01

前言 一直想玩玩墨水屏&#xff0c;这次咸鱼找了全新的ses价签&#xff0c;而且价格还很便宜&#xff0c;于是买了一个2.66寸三色&#xff0c;和一个4.2寸三色的墨水屏幕&#xff0c;经过几天的折腾终于能正常显示了。 显示效果如下&#xff1a; 折腾来折腾去&#xff0c;发…

DMES-2023第十三届数字营销与电商峰会大会 火热报名中

2023第十三届数字营销与电商峰会将于7月6-7日在上海召开&#xff01; 本次峰会线上线下同步举行&#xff0c;将通过七大热点主题帮助品牌主突破模式能力&#xff0c;回归初心、精耕细作&#xff0c;实现可持续增长&#xff1b;提升产品能力&#xff0c;实现可持续长期增长&…