入口

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/daily-temperatures/description/

题目描述

给定一个整数数组 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

方法一:暴力法

该算法使用两个嵌套循环,对于每一天,它都会遍历后续的天数来查找第一个温度升高的日子。测试集足够大时,此方法在leetcode中会超出时间限制。

Java实例

class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int[] res = new int[temperatures.length]; // 用于存储结果的数组 for (int i = 0; i < temperatures.length; i++) {
int temp = 0; // 用于记录等待的天数 for (int j = i+1; j < temperatures.length; j++) {
if (temperatures[j] > temperatures[i]) {
temp = j - i; // 如果找到升高的温度,则计算等待的天数
break; // 跳出内层循环,因为已经找到了升高的温度
}
} res[i] = temp; // 将等待的天数存储在结果数组中
} return res; // 返回结果数组
}
}

复杂度分析

  • 时间复杂度:O(n^2),其中 n 是温度数组的长度。因为对于每一天,最坏情况下需要遍历数组的其余部分来找到温度升高的日子。
  • 空间复杂度:O(1),只使用了常量级的额外空间。

方法二:暴力法改进-辅助数组

该方法是暴力法的改进方法,其核心思想是利用辅助数组 next 来记录每个温度后面出现的更高温度的索引位置,从而避免了嵌套循环。

辅助数组 next: 这个数组的索引表示温度值,数组中的值表示该温度值在原数组中出现的索引位置。初始化为最大值,表示当前温度后面没有更高的温度。

逆序遍历原数组: 从数组末尾开始向前遍历,这是因为我们需要找的是每个温度后面第一次出现的更高温度,逆序遍历可以确保我们从后往前找到更高温度。

查找更高温度的索引: 对于每个温度,我们不需要遍历其后面的所有温度,而是直接查找辅助数组 next 中大于当前温度的最小索引值,即下一个更高温度的索引。

通过这种方法,我们只需要一次遍历原数组,时间复杂度为 O(n),大大提高了效率。

Java示例

    public static int[] dailyTemperatures(int[] temperatures) {
int length = temperatures.length;
int[] ans = new int[length]; // 用于存储结果的数组
int[] next = new int[101]; // 辅助数组,用于存储下一个更暖和的温度的索引 // 初始化辅助数组为最大值,表示没有更暖和的温度
Arrays.fill(next, Integer.MAX_VALUE); // 从数组末尾开始遍历
for (int i = length - 1; i >= 0; --i) {
int warmerIndex = Integer.MAX_VALUE; // 用于记录下一个更暖和的温度的索引, 初始值设为 Integer.MAX_VALUE,表示初始情况下没有更高温度。 // 遍历当前温度之后的所有可能温度,最高温度不会超过 100
for (int t = temperatures[i] + 1; t <= 100; ++t) {
if (next[t] < warmerIndex) { //找到了比当前温度更高的温度,并且它的索引比之前记录的更高温度索引还要小,就更新 warmerIndex。这样,warmerIndex 就始终记录着当前温度后面第一次出现更高温度的索引位置。
warmerIndex = next[t]; // 找到下一个更暖和的温度的索引
}
} // 如果找到了更暖和的温度,则计算等待的天数
if (warmerIndex < Integer.MAX_VALUE) {
ans[i] = warmerIndex - i;
} // 更新辅助数组,将当前温度的索引存储在相应的位置
next[temperatures[i]] = i;
} return ans; // 返回结果数组
}

复杂度分析

  • 时间复杂度:O(nm),其中 n 是温度列表的长度,m 是数组 next 的长度,在本题中温度不超过 100,所以 m 的值为 100。反向遍历温度列表一遍,对于温度列表中的每个值,都要遍历数组 next 一遍。
  • 空间复杂度:O(m),其中 m 是数组 next 的长度。除了返回值以外,需要维护长度为 m 的数组 next 记录每个温度第一次出现的下标位置。

方法三:单调栈

​​​​​​​

import java.util.Deque;
import java.util.LinkedList; class Solution {
public int[] dailyTemperatures(int[] temperatures) {
// 创建一个数组用于存储结果,长度与温度数组相同
int[] ans = new int[temperatures.length];
// 创建一个栈用于存储温度数组的索引
Deque<Integer> stack = new LinkedList<>();
// 遍历温度数组
for(int i = 0; i < temperatures.length; ++i){
// 如果栈不为空并且当前温度大于栈顶温度
while(!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]){
// 弹出栈顶索引,计算等待天数并记录到结果数组中
int preIndex = stack.pop();
ans[preIndex] = i - preIndex;
}
// 将当前索引入栈
stack.push(i);
}
// 返回结果数组
return ans;
}
}

时间复杂度:O(n),其中 nnn 是温度列表的长度。正向遍历温度列表一遍,对于温度列表中的每个下标,最多有一次进栈和出栈的操作。

空间复杂度:O(n)O,其中 nnn 是温度列表的长度。需要维护一个单调栈存储温度列表中的下标。

单调栈练习题
leetcode496.下一个更大元素1
leetcode901.股票价格跨度
leetcode42.接雨水
leetcode84.柱状图中最大的矩形

[每日算法 - 阿里机试] leetcode739. 每日温度的更多相关文章

  1. 每日算法 - day 15

    每日算法 those times when you get up early and you work hard; those times when you stay up late and you ...

  2. 2015 NI 校招笔试机试面试

    美国国家仪器NI也算是入驻上海很好的一家外企了,它是我们院的合作公司,加上今年NI在我们院扩招实习生,这次是一个难得的机会可以进入NI实习,可惜我并没有好好把握... 一.笔试 几个做错的印象特别深刻 ...

  3. 华为OJ机试训练(一)

    题目1 -- 通过输入英文句子.将每一个单词反过来,标点符号顺序不变.非26个字母且非标点符号的情况就可以标识单词结束. 标点符号包含,.!? 比如输入:Hello, I need an apple. ...

  4. 【转】朱兆祺教你如何攻破C语言学习、笔试与机试的难点(连载)

    原文网址:http://bbs.elecfans.com/jishu_354666_1_1.html 再过1个月又是一年应届毕业生应聘的高峰期了,为了方便应届毕业生应聘,笔者将大学四年C语言知识及去年 ...

  5. 华为机试ACM(字符组合问题)

    今晚做了华为的机试,3道ACM题,最后一道是实现从M个不同字符中任取N个字符的所有组合. eg: input:ABC 2 output:AB AC BC 第一个输入为字符串,第二个输入为组合的字符个数 ...

  6. 机试指南第二章-经典入门-Hash的应用自解

    Hash的应用: Hash即散列,不像数据结构与算法中讲的各种Hash方法和冲突处理等过多的阐述,以下主要介绍Hash在机试试题解答中的作用. 例2.5 统计同成绩学生人数 Hash解法AC代码:(一 ...

  7. java机试要点

    Java机试准备 一般结构:   import java.util.Scanner; public class Main{ public static void main(String[] args) ...

  8. 华为 2015 机试 输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的不要删除,例如,对应输出为:33aabb55pin。

    package 华为机试; //C++ 输入:由数字和字母组成的字符串,例如:333aaabb55ppin //输出:数字后面的连续出现的(2个或多个)相同字符(数字或者字符),删去一个,非数字后面的 ...

  9. 2014华为机试西安地区B组试题

    2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.開始,电灯所有关着. 有n ...

  10. 华为机试001:字符串最后一个单词的长度(华为OJ001)

    华为机试 字符串最后一个单词的长度 计算字符串最后一个单词的长度,单词以空格隔开. 提交网址: http://www.nowcoder.com/practice/8c949ea5f36f422594b ...

随机推荐

  1. CH32V203F6P6-TSSOP20测试之02---点灯成功

    一.问题思考 直接用官方提供的例程,为何下载程序后没有什么响应,难道自己设计的电路有什么不妥? 于是,对于电路进行具体分析,结果发现: 第一.官方的BOOT0采用杜邦线连接,在芯片手册好像找不到关于B ...

  2. SpringBoot集成MinIO8.3.x 依赖冲突解决,至简之招覆盖spring-boot-dependencies的依赖版本声明

    版本声明 SpringBoot 2.6.5 MinIO 8.3.7 报错信息 An attempt was made to call a method that does not exist. The ...

  3. Solution -「NOI 2017」「洛谷 P3823」蚯蚓排队

    \(\mathscr{Description}\)   Link.   (自己看题, 我总不能让题意比题解还长吧?) \(\mathscr{Solution}\)   下一组我一定写成 solutio ...

  4. 《深入理解Mybatis原理》Mybatis中的缓存实现原理

    一级缓存实现 什么是一级缓存? 为什么使用一级缓存? 每当我们使用MyBatis开启一次和数据库的会话,MyBatis会创建出一个SqlSession对象表示一次数据库会话. 在对数据库的一次会话中, ...

  5. Nginx日常运维方法Linux版

    1,安装? 下载RPM:wget http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.10.0-1.el7.ngx.x86_64.rpm 离线 ...

  6. Linux下本地yum源配置及局域网yum配置

    1.Linux下本地yum源配置 本地yum源依赖于python解析,首先要确保系统的python和yum源安装完成 1.1.本地yum源配置及挂载 上传ISO镜像或使用本机镜像,使用mount命令挂 ...

  7. 一种基于alpine、支持ARM架构64位的镜像构建方法及其构建系统

    本文分享自天翼云开发者社区<一种基于alpine.支持ARM架构64位的镜像构建方法及其构建系统>,作者:郑****团 一种基于alpine.支持ARM架构64位的镜像构建方法及其构建系统 ...

  8. Atcoder ABC329E Stamp 题解 [ 绿 ] [ 线性 dp ]

    Stamp:难点主要在 dp 转移的细节与分讨上,但通过改变状态设计可以大大简化分讨细节的题. 观察 首先要有一个观察:只要某一个前缀能被覆盖出来,那么无论它后面多出来多少,后面的字符串都可以帮他重新 ...

  9. 清华博士后的DeepSeek使用手册,104页,真的是太厉害了!(免费领取源文件)

    <DeepSeek从入门到精通2025>是由清华大学元宇宙文化实验室的余梦珑博士后及其团队撰写.文档的核心内容围绕DeepSeek的技术特点.应用场景.使用方法以及如何通过提示语设计提升A ...

  10. flutter-全局控制键盘收回和单独控制键盘收回

    局部控制键盘收回 import 'package:flutter/material.dart'; import 'package:TLDF/main.dart'; class KeyboardBack ...