Leetcode. 739 每日温度

Java实现 LeetCode 739 每日温度(暴力循环) 739. 每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 提示:气温 列表长度的范围是 [1, 30000... 阅读详情

题目信息

LeetoCode地址: . - 力扣(LeetCode)

题目理解

题意很好理解,找到比每日温度更高的温度的已过天数的偏移量。如果找不到,则设为0。

最直观的想法是,从每一天开始向后一天一天找,直到找到更高温度的那一天。但是这种做法时间复杂度过高,有太多重复的操作,因此需要找更优的算法。

单调栈写法

容易发现,当遍历到第i天,温度为25度的前提下,如果第i+1天的温度比25度高,则第i天的结果很好计算,即是1. 如果第i+1天的温度没超过2度,则暂时得不到结果,那不如先将第i+1天的温度暂存起来,继续看第i+2天,如果温度继续走低,则继续看后一天。直到某一天温度比前一天高,假设第j天,则我们可以在暂存区里拿出来这一天,将结果求出。类似的,我们可以将暂存区里更之前的温度也拿出来和第j天对比,求出结果,直到暂存区里的温度都比第j天高,此时再将第j天的温度放入暂存区,重复该过程。

这个暂存区的存取总是后放入的先拿出来计算,很显然是栈的操作,所以这种做法就是单调栈做法。

在temperatures数组的长度为l的情况下,

时间复杂度: O(l), 因为我们对每一个温度只会有三种操作,放入栈,拿出栈,或者直接计算偏移量。

额外空间复杂度:O(l),我们需要一个大小为l的栈存放持续走低的温度数据,直到遇到更大的。

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int l = temperatures.length;
        int[] stack = new int[l];
        int stackTopIndex = -1;
        int[] result = new int[l];
        int i = 0;
        while (i < l) {
            if (stackTopIndex == -1) {
                stack[++stackTopIndex] = i++;
            } else {
                if (temperatures[i] <= temperatures[stack[stackTopIndex]]) {
                    stack[++stackTopIndex] = i++;
                } else {
                    result[stack[stackTopIndex]] = i - stack[stackTopIndex];
                    stackTopIndex--;
                }
            }
        }
        return result;
    }
}

动态规划写法

如何能利用之前算过的数据来推导还未计算过的温度的偏移量呢?让我们分析一下。

很显然,最后一天的温度的更高温度偏移量为0,因为后面没有数据了。

倒数第二天的温度如果比最后一天低,则偏移量为1;相反,如果相同或者更高,则可以根据后一天的偏移量, 这里最后一天的偏移量是0,所以倒数第二天的偏移量也是0;

...

倒数第n天,类似的,先看n+1天,如果温度更高了,则偏移量为1; 相反,则看n+1天的偏移量之后的温度,更高了,则偏移量(n) = 1 + 偏移量(n+1);如果温度还是不够高,则继续看其偏移量,直到满足条件,或者到达最后一天。

这种根据已有的结果计算其他数据的思想就是动态规划。

在temperatures数组的长度为l的情况下,

时间复杂度: O(l), 看似我们有循环操作,但是它们搜索的数据空间没有重复,因此时间复杂度是O(l).

额外空间复杂度:O(1), 除了存放结果的集合,不需要其他额外的空间。

class Solution {
public int[] dailyTemperatures(int[] temperatures) {
        int[] dp = new int[temperatures.length];
        dp[temperatures.length-1] = 0;
        for (int i = temperatures.length-2; i>=0;i--) {
            if (temperatures[i] < temperatures[i+1]) {
                dp[i] = 1;
            } else {
                int j = i+1;
                while (j < dp.length && temperatures[j] <= temperatures[i]) {
                    if (dp[j] == 0) {
                        break;
                    }
                    j = j + dp[j];
                }
                if (j < dp.length && temperatures[j] > temperatures[i]) {
                    dp[i] = j-i; 
                }
            
            }
        }
        return dp;
    }
}

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

相关推荐

【Leetcode_总结】 739. 每日温度 - python

Q: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的都...

maka_uir的博客 1024

Leetcode 739. 每日温度

Leetcode 739. 每日温度1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/daily-temperatures/   本质上就是一个动态规划问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #include "algo

珍惜 8983

模糊控制——基本原理(附MATLAB程序)

模糊化:使用隶属函数将实际输入转换为模糊集合的隶属度值。规则库:利用“如果-那么”规则将模糊输入映射到模糊输出。推理机制:通过规则的模糊化和模糊集合的合成,生成模糊输出。去模糊化:将模糊输出转换为具体的控制信号,常用的方法包括质心法和最大隶属度法。这些步骤综合起来,实现了模糊控制系统对复杂和不确定系统的有效控制。模糊控制系统通过结合模糊逻辑和规则库来处理复杂系统中的不确定性和模糊性。它的核心在于模糊集合和隶属函数,通过推理机处理模糊规则,并最终通过去模糊化生成具体的控制信号。

qq_35623594的博客 5558

力扣题解系列:739. 每日温度

题目:739. 每日温度 题目描述: 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。 示例: 输入:[73, 74, 75, 71, 69, 72, 76, 73] 输出:[1, 1, 4, 2, 1, 1, 0, 0] 提示: 1.气温 列表长度的范围是 [1, 30000]。 2. 每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。 来源:力扣(LeetCode) 链接:ht

qq_38813052的博客 396

保姆级教程:在Ubuntu 20.04上搞定pybind11,解决‘找不到头文件’的坑

本文提供了一份详细的Ubuntu 20.04下pybind11配置指南,重点解决常见的'找不到头文件'问题。从环境准备、安装策略到三种专业解决方案(修改CMakeLists.txt、环境变量方案、绝对路径包含),帮助开发者高效搭建C++与Python的桥梁。

weixin_28829325的博客 284

安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案

本文主要介绍了安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

力扣【每日温度】leetcode-739.每日温度:单调栈解法

题目描述: 思路: 单调栈解法: class Solution { public: vector<int> dailyTemperatures(vector<int>& T) { vector<int> res(T.size());//存放的是索引 stack<int> s; //使用单调栈 for (int i = T.size() - 1; i >= 0; i --)

比特的一天 337

超声波传感器(CHx01) 学习笔记 Ⅲ - I2C读写操作

CH-x01 通过 2 线 I2C 协议与主机处理器通信

nicole088的专栏 1737

leetcode 739——每日温度

leetcode 739——每日温度(C++) 题目描述: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 提示:...

weixin_44795839的博客 201

视图库对接系列(GA-T 1400)一、简单介绍

GA/T 1400《公安视频图像信息应用系统》 是我们需要参考看看的相关文档,里面有对应的标准和介绍,没有这个文档的话可以加群找我要。群的话 我放在最下面了。我们先简单想几个问题, 也就是这个协议主要干什么用的,为什么要有, 能做什么。

qq_37716298的博客 4285

手把手教你学基带SOC芯片(4.4.9)--基带芯片的电源管理实例:高通 Snapdragon 系列实例(十)

Snapdragon 888 通过支持多种深度睡眠模式,如 AOAC 模式、低功耗模式和深度睡眠模式,以及智能电源管理技术,实现了对功耗的精细管理。这些模式不仅延长了设备的电池寿命,还确保了用户在各种使用场景下的良好体验。无论是保持网络连接、限制后台活动,还是完全关闭不必要的功能,Snapdragon 888 都能够灵活应对,提供高效的功耗管理方案。

MHD0815的博客 740

LeetCode 739.每日温度

LeetCode 739.每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 遍历的方法 从后一天往前一天推,这样这天...

缇欧的咪西 266

OmniParser V2 和 OmniTool 让 AI 来控制 Windows 设备

OmniParser V2 和 OmniTool 是由微软开发的一套工具,通过屏幕解析技术让 AI 能够理解和控制 Windows 设备。OmniParser V2 是一款数据解析工具,可以解读屏幕内容,并将内容传递给大模型OmniTool 则是一个运行 Windows Agent 的工具,提供 Windows 界面给 AI 操作。

简简单单Onlinezuozuo 2731

LeetCode739 每日温度

LeetCode739 每日温度题目描述题解暴力解法思路复杂度时间复杂度我的方法思路复杂度时间复杂度空间复杂度代码动态规划思路复杂度时间复杂度空间复杂度代码单调栈思路复杂度时间复杂度空间复杂度代码 题目描述 请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1,

weixin_37669628的博客 324

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode 739 - 每日温度

摘要:LeetCode 739题要求计算每日温度后首次出现更高温度的天数差。使用单调栈(递减)优化解法,时间复杂度O(n),空间复杂度O(n)。核心思路是栈中存储未找到更高温度的日期索引,当遇到更高温度时弹出栈顶元素并计算天数差。Python/Java/Rust实现均遵循此逻辑,避免O(n²)的暴力解法。关键点包括栈存索引、维护递减性及正确初始化结果数组。

weixin_45980775的博客 1039

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

leetcode739. 每日温度(单调栈-java)

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。输入: temperatures = [73,74,75,71,69,72,76,73],使用某类容器装载我们所有的「待更新」的位置(下标),假设当前处理到的是。输入: temperatures = [30,40,50,60]输出: [1,1,4,2,1,1,0,0]输出: [1,1,1,0]输出: [1,1,0]

SP_1024的博客 991

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

leetcode739. 每日温度

leetcode739. 每日温度 根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。 方法:单调栈 思路:

weixin_43422466的博客 367

力扣739:每日温度【C++】

题目分析 原题: 请根据每日气温列表,重新生成一个列表,对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 分析: 这道题的题意并不难理解,对于输入列表的每一个元素,从下标大于其下标的元素中寻找第一个大于它的值,并记录下标之差,最后将所有下标之差返回。 思路分析 思路一:暴力查找 通过分析题意,最好想到的方法就是暴力查找。其具体思路是: 第一步:创建一个容器v用于装填输出。若输入为空直接返回v。 第二步:既然是对于输入列表的每一个元素,那么考虑

The Gao的博客 985

739. 每日温度 - 力扣(LeetCode)

本文介绍了三种计算每日温度间隔的方法:1)暴力法(O(n²)时间,O(1)空间),通过双重循环比较;2)预处理逆序优化法(平均O(n)时间),从后向前跳跃比较;3)单调栈法(O(n)时间,O(n)空间),利用栈结构高效处理。第三种方法最优,每个元素只需处理一次。代码实现展示了各算法的Python解决方案,并附有详细注释说明执行过程。

Rickest_man的博客 320

LeetCode 739. 每日温度

LeetCode 739. 每日温度题目我的思路代码 题目 我的思路 循环数组 循环数组的同时,循环栈 判断栈顶索引所对应的数组中的值,与循环到的值温度哪个高 由于栈后进先出的特性,是一天一天往前推的 如果循环到的这个值高,说明升温了,以此计算索引差值,计算多少天升温 移除栈顶元素,同时更新栈顶这个索引在数组中的值,也就是几天升温 代码 class Solution { public i...

乐之终曲 382

【hot100】跟着小王一起刷leetcode -- 739. 每日温度

这道题还是挺有意思的,大家一起讨论讨论。

就很有趣的博客 990

LeetCode 739每日温度

LeetCode 739每日温度Medium 题目简述:请根据每日 气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 输入:temperatures = [73, 74, 75, 71, 69, 72, 76, 73] 输出:[1, 1, 4, 2, 1, 1, 0, 0] 思路:利用递减单调栈找到右边大于栈顶的元素,弹出栈顶直到满足单调递减,同时记录弹出元素与当前i的距离,保存在res数组中即是答案。

XBlog 430

力扣:739. 每日温度

当前位置温度比栈顶大就栈顶--,退出循环再栈顶加入当前温度。典型的单调栈问题,从右边遍历枚举维护单调栈即可。答案存到数组ant中,

qq_74924951的博客 597

LeetCode 739. 每日温度 | Python

使用单调栈的方法,解决《739. 每日温度》问题。

"大梦三千秋的博客 992

每日一题:Leetcode-739 每日温度

力扣题目解题思路java代码。

LIUCHANGSHUO的博客 708
上一篇: Leetcode 85. 最大矩形
下一篇: Leetcode.901 股票价格跨度
耐利
博客等级 码龄12年 188粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值