news 2026/6/23 16:22:25

【每日算法】LeetCode 739. 每日温度:从暴力遍历到单调栈的优雅解决

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【每日算法】LeetCode 739. 每日温度:从暴力遍历到单调栈的优雅解决

对前端开发者而言,学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习,你将会感受到自身技术视野和问题解决能力的质的飞跃。------ 算法:资深前端开发者的进阶引擎

LeetCode 739. 每日温度:从暴力遍历到单调栈的优雅解决

1. 题目描述

给定一个整数数组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 <= 10^5
  • 30 <= temperatures[i] <= 100

2. 问题分析

这道题本质上是在寻找每个元素右侧第一个比它大的元素,并计算两者之间的索引距离。在前端开发中,类似的问题场景很多,例如:

  • 在时间轴组件中,寻找下一个热度更高的事件点。
  • 在股票价格图表中,计算下一次价格超过当前价格所需的天数。
  • 在构建响应式布局时,可能需要根据元素宽度找到下一个更宽的断点。

由于数据规模可达10^5,简单的O(n^2)暴力解法会超时,因此必须寻找更优的O(n)O(n log n)解法。

3. 解题思路

3.1 暴力法(双层循环)

对于每个元素,向后遍历直到找到第一个比它大的元素,计算索引差。这种方法直观但效率低下。

复杂度分析:

  • 时间复杂度:O(n²),在最坏情况下(如单调递减数组)需要比较 n*(n-1)/2 次。
  • 空间复杂度:O(1),除了结果数组外,没有使用额外的空间。

3.2 单调栈法(最优解)

维护一个存储下标的栈,栈中的下标对应的温度是单调递减的。遍历数组,当当前温度大于栈顶下标对应的温度时,说明当前温度是栈顶下标的下一个更高温度,于是弹出栈顶,计算索引差,并将结果存入答案数组。重复此过程直到栈为空或当前温度不大于栈顶温度,然后将当前下标入栈。

复杂度分析:

  • 时间复杂度:O(n),每个元素最多入栈和出栈一次。
  • 空间复杂度:O(n),最坏情况下栈的大小为 n。

4. 各思路代码实现

4.1 暴力法代码实现

/** * @param {number[]} temperatures * @return {number[]} */vardailyTemperatures=function(temperatures){constn=temperatures.length;constanswer=newArray(n).fill(0);for(leti=0;i<n;i++){for(letj=i+1;j<n;j++){if(temperatures[j]>temperatures[i]){answer[i]=j-i;break;}}}returnanswer;};

4.2 单调栈法代码实现

/** * @param {number[]} temperatures * @return {number[]} */vardailyTemperatures=function(temperatures){constn=temperatures.length;constanswer=newArray(n).fill(0);conststack=[];// 存储下标,栈底到栈顶对应的温度递减for(leti=0;i<n;i++){// 当栈不为空且当前温度大于栈顶下标对应的温度时while(stack.length&&temperatures[i]>temperatures[stack[stack.length-1]]){constidx=stack.pop();answer[idx]=i-idx;}stack.push(i);}returnanswer;};

单调栈法的过程示例(以 temperatures = [73,74,75,71,69,72,76,73] 为例):

步骤当前索引 i当前温度栈 (下标)操作answer 更新
1073[]栈空,0入栈[]
2174[0]74 > 73,弹出0,answer[0]=1-0=1,然后1入栈[1,0,0,0,0,0,0,0]
3275[1]75 > 74,弹出1,answer[1]=2-1=1,然后2入栈[1,1,0,0,0,0,0,0]
4371[2]71 <= 75,3入栈[1,1,0,0,0,0,0,0]
5469[2,3]69 <= 71,4入栈[1,1,0,0,0,0,0,0]
6572[2,3,4]72 > 69,弹出4,answer[4]=5-4=1;72 > 71,弹出3,answer[3]=5-3=2;72 <= 75,停止,5入栈[1,1,0,2,1,0,0,0]
7676[2,5]76 > 72,弹出5,answer[5]=6-5=1;76 > 75,弹出2,answer[2]=6-2=4;栈空,6入栈[1,1,4,2,1,1,0,0]
8773[6]73 <= 76,7入栈[1,1,4,2,1,1,0,0]
结束--[6,7]栈中剩余元素对应 answer 为 0(已初始化)[1,1,4,2,1,1,0,0]

5. 各实现思路的复杂度、优缺点对比表格

方法时间复杂度空间复杂度优点缺点适用场景
暴力法O(n²)O(1)实现简单,易于理解效率低,在数据量大时无法通过数据规模较小(n ≤ 10³)或快速原型验证
单调栈法O(n)O(n)效率高,线性时间解决需要理解栈的单调性,相对抽象数据规模大(n ≤ 10⁵),需要高效求解

6. 总结

单调栈是解决“下一个更大元素”类问题的经典方法。它通过维护一个单调递减的栈,将寻找下一个更高温度的过程从暴力遍历的 O(n²) 优化到 O(n)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 1:58:44

Golin终极指南:网络安全扫描与等保核查的完整解决方案

Golin终极指南&#xff1a;网络安全扫描与等保核查的完整解决方案 【免费下载链接】Golin 弱口令检测、 漏洞扫描、端口扫描&#xff08;协议识别&#xff0c;组件识别&#xff09;、web目录扫描、等保模拟定级、自动化运维、等保工具&#xff08;网络安全等级保护现场测评工具…

作者头像 李华
网站建设 2026/6/22 3:37:40

77、由于您仅提供了“以下”两个字,没有具体的英文内容,所以我无法按照要求为您生成博客,请您提供完整的英文内容。

由于您仅提供了“以下”两个字&#xff0c;没有具体的英文内容&#xff0c;所以我无法按照要求为您生成博客&#xff0c;请您提供完整的英文内容。请您先提供完整的英文内容&#xff0c;这样我才能为您生成符合要求的博客下半部分。目前仅“以下”二字&#xff0c;没有足够信息…

作者头像 李华
网站建设 2026/6/22 23:22:16

Grafana中文版终极指南:快速搭建专业数据可视化监控平台

Grafana中文版终极指南&#xff1a;快速搭建专业数据可视化监控平台 【免费下载链接】grafana-chinese grafana中文版本 项目地址: https://gitcode.com/gh_mirrors/gr/grafana-chinese Grafana中文版是一款基于官方源码深度汉化的专业数据可视化工具&#xff0c;为中文…

作者头像 李华
网站建设 2026/6/21 18:47:07

4、Mac OS X系统使用指南:从Launchd到Shell操作

Mac OS X系统使用指南:从Launchd到Shell操作 1. Launchd系统启动程序 从Mac OS X 10.4(Tiger)开始,苹果引入了名为launchd的新系统启动程序。在此之前,cron、xinetd、mach_init和init等传统系统负责处理系统初始化、脚本调用、启动项运行以及为用户准备系统。虽然这些系…

作者头像 李华
网站建设 2026/6/23 14:51:50

6、Mac OS X 文件操作全攻略

Mac OS X 文件操作全攻略 在Mac OS X系统中,文件操作是日常使用的重要部分。本文将详细介绍文件操作的各个方面,包括进程通信、文件和目录权限设置、文件复制、文件搜索等内容。 1. 进程通信:命名管道和套接字 在进程间通信时,可以创建命名管道或套接字。命名管道通常用…

作者头像 李华
网站建设 2026/6/16 15:07:36

XXPermissions深度解析:Android权限框架的架构揭秘与实践指南

XXPermissions深度解析&#xff1a;Android权限框架的架构揭秘与实践指南 【免费下载链接】XXPermissions Android 权限请求框架&#xff0c;已适配 Android 14 项目地址: https://gitcode.com/GitHub_Trending/xx/XXPermissions 在Android开发领域&#xff0c;权限管理…

作者头像 李华