LeetCode 739 Daily Temperatures 题解:单调栈求解“下一个更大元素“距离
LeetCode 739 Daily Temperatures 题解单调栈求解下一个更大元素距离【免费下载链接】leetcodeLeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解记录自己的leetcode解题之路。)项目地址: https://gitcode.com/gh_mirrors/le/leetcode导读本文围绕 LeetCode 739「每日温度Daily Temperatures」展开这是 leetcode 题解仓库「每日一题」系列活动在 2019-06-06 收录的经典题目对应源码位于 daily/answers/739.daily-temperatures.js。题目要求对每一天的温度计算需要等待多少天才能出现更高的温度本质是数组中每个元素之后第一个更大元素的距离问题。读完本文你将掌握两种解法O(n²) 暴力双层循环与 O(n) 单调递减栈并理解单调栈这一算法范式如何在 42. 接雨水、84. 柱状图中最大的矩形 等同类问题中复用。一、信息卡片与题目背景该题在每日一题中的基础信息如下时间2019-06-06题目739. Daily TemperaturestagArrayStack仓库的 daily/README.md 中记录了每日一题的历史汇总其中第 739 题的条目为tag: Array Stack与本题核心算法数组 栈完全对应。每日一题是仓库作者在交流群中发起的共解一道题的活动题目被记录后会筛选进入题解模块因此本文所讲解的解法与仓库 problems 目录下的正式题解同源同质。二、题目描述与约束分析原题描述如下Given a list of daily temperatures T, return a list such that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0 instead.示例输入输出T [73, 74, 75, 71, 69, 72, 76, 73] 输出 [1, 1, 4, 2, 1, 1, 0, 0]约束条件温度列表长度范围[1, 30000]每个温度取值[30, 100]。题意拆解对于下标i需要找到最小的j i使得T[j] T[i]答案记为j - i若不存在这样的j答案记为0。例如T[2] 75之后第一个大于 75 的是下标 6 的 76等待天数为6 - 2 4。需要特别注意的是等值不算更暖只有严格大于才满足条件这一细节在编写比较条件时容易出错也是两种解法的核心比较符。三、解法一暴力双层循环O(n²)3.1 思路最简单直观的做法外层循环枚举当天T[i]内层循环枚举当天之后的每一天T[j]j从i1开始一旦找到第一个满足T[j] T[i]的j则result[i] j - i并跳出内层循环若内层循环结束仍未找到result[i]保持0。原文档给出的 JavaScript 实现/** * param {number[]} T * return {number[]} * 双层for循环 */ var dailyTemperatures function(T) { let result []; for(let i 0; i T.length; i) { result[i] 0; for(let j i 1; j T.length; j) { if (T[i] T[j]) { result[i] j - i; break; } } } return result; };3.2 复杂度与缺陷时间复杂度O(n²)。最坏情况下如温度严格递减[100, 99, 98, ...]每个i都要遍历完其后所有元素空间复杂度O(1)除结果数组外无额外空间。原文档对该解法的评价是效率很低这在 n 最大达 30000 时尤其明显——最坏约 9 亿次比较在 LeetCode 上大概率超时。暴力解法价值在于帮助理解题意作为优化解的对照基准。四、解法二单调递减栈O(n)4.1 核心思想栈中存下标优化思路是用空间换时间维护一个栈栈内保存的是尚未找到下一个更高温度的下标。关键技巧在于栈中存下标而非温度值因为答案要求天数差j - i存下标才能同时取出温度T[下标]和计算距离。维护单调性从栈底到栈顶下标对应的温度单调递减即栈顶是当前已扫描温度中最低的待处理下标。这正是 thinkings/monotone-stack.md 中定义的单调递减栈以出栈顺序看被弹出的元素按温度递减排列。4.2 算法步骤初始化空栈stack和结果数组result初始全部为 0从左到右for遍历数组当前下标为i若栈非空且T[stack 栈顶] T[i]说明当前温度T[i]就是栈顶下标之后第一个更高的温度于是弹出栈顶peek令result[peek] i - peek重复上一步直到栈空或栈顶温度不小于T[i]保持单调递减将i入栈遍历结束后栈中剩余的下标都是其后不存在更高温度的天其result保持初始值0。原文档给出的 JavaScript 实现/** * param {number[]} T * return {number[]} * 递减栈 */ var dailyTemperatures function(T) { let stack []; let result []; for (let i 0; i T.length; i) { result[i] 0; while(stack.length 0 T[stack[stack.length - 1]] T[i]) { let peek stack.pop(); result[peek] i - peek; } stack.push(i); } return result; };Python3 实现class Solution: def dailyTemperatures(self, T: List[int]) - List[int]: stack [] ans [0] * len(T) for i in range(len(T)): while stack and T[i] T[stack[-1]]: peek stack.pop(-1) ans[peek] i - peek stack.append(i) return ans4.3 逐步推演示例以T [73, 74, 75, 71, 69, 72, 76, 73]为例iT[i]操作栈存下标结果变化073入栈[0]result 全 0174T[0]73 74弹出 0result[0]1-01入栈 1[1]result[0]1275T[1]74 75弹出 1result[1]1入栈 2[2]result[1]137171 不大于 75直接入栈[2,3]-46969 不大于 71直接入栈[2,3,4]-572T[4]69 72弹出 4result[4]1T[3]71 72弹出 3result[3]2入栈 5[2,5]result[4]1, result[3]2676T[5]72 76弹出 5result[5]1T[2]75 76弹出 2result[2]4入栈 6[6]result[5]1, result[2]477373 不大于 76入栈[6,7]-最终result [1, 1, 4, 2, 1, 1, 0, 0]与题目示例一致。可以看到一个暖锋如 76经过时会把栈中所有比它冷的天一次性结算掉这正是单调栈高效的本质。4.4 复杂度分析时间复杂度O(n)。每个下标最多入栈一次、出栈一次均摊 O(1)总代价线性空间复杂度O(n)。栈最多同时容纳 n 个下标例如温度严格递减时。仓库答案文件 daily/answers/739.daily-temperatures.js 同时保留了两种解法的实现暴力版本被注释保留作为对比正式采用单调栈版本并标注了典型的空间换时间——这与本文的复杂度结论完全一致可作为源码级佐证。五、举一反三单调栈通用模板739. Daily Temperatures是 thinkings/monotone-stack.md 专题文章明确引用的代表题目见其题目推荐一节。该专题总结了如下通用模板核心一句话是如果压栈之后仍然可以保持单调性直接压否则先弹出栈内元素直到压入后可以保持单调性。Python 模板class Solution: def monostoneStack(self, arr: List[int]) - List[int]: stack [] ans [0] * len(arr) # 初始值根据题意调整可能是 -1 或 0 for i in range(len(arr)): while stack and arr[i] arr[stack[-1]]: peek stack.pop() ans[peek] i - peek stack.append(i) return ansJavaScript 模板var monostoneStack function (T) { let stack []; let result []; for (let i 0; i T.length; i) { result[i] 0; while (stack.length 0 T[stack[stack.length - 1]] T[i]) { let peek stack.pop(); result[peek] i - peek; } stack.push(i); } return result; };5.1 模板的三个可调点比较符号求解下一个更大元素用arr[i] arr[栈顶]求解下一个更小元素则反向。本题是找更高温度故用Python 中对应T[i] T[stack[-1]]答案赋值本题存天数差i - peek若题目要求存值如下一个更大元素的值则改为ans[peek] arr[i]初始值本题不存在更高温度时填 0若题目要求不存在时填 -1则初始化数组为 -1与 thinkings/monotone-stack.md 伪代码一致。5.2 边界与哨兵法原文档与单调栈专题均提醒遍历结束后栈中残留的下标没有下一个更大元素。若题目需要利用到数组的全部信息容易因忽略边界而漏解。专题推荐哨兵法在原数组右侧追加一个足够小的值如 -1强制在遍历末尾把所有剩余元素弹出结算从而简化代码逻辑。本题中残留元素答案天然为 0无需额外处理但理解这一技巧有助于应对其他变体。六、单调栈相关题目推荐掌握了 739 的单调栈解法后可以在仓库中继续挑战以下同族题目它们都依赖下一个更大/更小元素这一核心场景42. 接雨水其前置知识明确列出单调栈属于难度较大的应用84. 柱状图中最大的矩形同样以单调栈为前置知识寻找左右边界1019. 链表中的下一个更大节点把数组换成链表思路与本题高度同构其题解原文明确指出看完题目就应该想到单调栈thinkings/monotone-stack.md 还推荐了 316. 去除重复字母、402. 移掉 K 位数字、496. 下一个更大元素 I、581. 最短无序连续子数组、901. 股票价格跨度等题目。七、总结LeetCode 739「每日温度」是单调栈算法最典型的入门题之一暴力解双层循环O(n²)思路简单适合理解题意但在 n30000 的约束下不可行单调递减栈O(n)用栈存下标、按温度单调的方式让每个元素只进出栈一次以 O(n) 空间换取 O(n) 时间解题关键三要素栈中存下标而非值、比较用严格大于等温不算更暖、残留栈元素的答案保持为0该题与仓库 thinkings/monotone-stack.md 专题、daily/answers/739.daily-temperatures.js 源码相互印证可作为学习下一个更大元素问题族的最佳起点后续可平滑过渡到接雨水、柱状图最大矩形、链表下一个更大节点等进阶题目。【免费下载链接】leetcodeLeetCode Solutions: A Record of My Problem Solving Journey.( leetcode题解记录自己的leetcode解题之路。)项目地址: https://gitcode.com/gh_mirrors/le/leetcode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

计算机毕业设计之基于Java的运动服装销售系统设计与实现

计算机毕业设计之基于Java的运动服装销售系统设计与实现

随着新经济的需求和新技术的发展,特别是网络技术的发展,如果可以建立起运动服装销售系统,可以改变传统线下管理方式,在过去的时代里都使用传统的方式实行,既花费了时间,又浪费了精力。在信息如此发达的今天…

2026/9/22 12:00:53 阅读更多 →
告别脆弱测试:Storybook+Jest打造坚不可摧的UI组件测试体系

告别脆弱测试:Storybook+Jest打造坚不可摧的UI组件测试体系

告别脆弱测试:StorybookJest打造坚不可摧的UI组件测试体系 UI组件测试常常面临维护成本高、反馈不及时的问题,而Storybook与Jest的组合为前端开发者提供了一套完整的解决方案。Storybook作为独立的UI组件开发环境,支持React、Vue、Angular等…

2026/9/22 12:00:59 阅读更多 →
Ant Design RangePicker 动态日期区间限制:disabledDate info.from 实战详解

Ant Design RangePicker 动态日期区间限制:disabledDate info.from 实战详解

Ant Design RangePicker 动态日期区间限制:disabledDate info.from 实战详解 【免费下载链接】ant-design An enterprise-class UI design language and React UI library 项目地址: https://gitcode.com/gh_mirrors/ant/ant-design 本篇围绕 Ant Design 官方…

2026/9/22 12:01:06 阅读更多 →

最新新闻

中小网络组网实战指南:从IP规划到无线漫游与排错

中小网络组网实战指南:从IP规划到无线漫游与排错

简介:这是一份面向中小企业与网络运维人员的网络组网解决方案PDF文档。文档聚焦中小网络建设中“部署简单、管理智能、成本可控”的核心诉求,从企业网络建设背景、需求痛点切入,详细给出信锐中小企业网络的极简交付架构设计:只需网…

2026/9/23 16:32:28 阅读更多 →
从单机登录到 8 台节点共享登录态:分布式 Session 方案踩坑实录

从单机登录到 8 台节点共享登录态:分布式 Session 方案踩坑实录

一个周五下午的报警去年我们团队把一个单体应用拆成了 8 台 Tomcat 节点挂在 Nginx 后面,上线当天下午就收到客诉:"我明明登录了,一刷新就把我踢出去了,再登录又好了,来回踢皮球。"运维同事第一反应是应用有…

2026/9/23 16:32:28 阅读更多 →
SpringBoot医院耗材管理系统设计与实现

SpringBoot医院耗材管理系统设计与实现

1. 项目概述医院耗材管理系统是医疗机构信息化建设的重要组成部分。这个基于SpringBoot的系统旨在解决传统医院耗材管理中存在的手工记录效率低、库存管理混乱、追溯困难等问题。系统采用B/S架构,整合了耗材采购、入库、领用、盘点、报废等全生命周期管理功能。我在…

2026/9/23 16:32:28 阅读更多 →
NOMA与ZF结合:QPSK调制MATLAB仿真与BER性能分析

NOMA与ZF结合:QPSK调制MATLAB仿真与BER性能分析

简介:这份资源面向无线通信方向的学生与研究人员,聚焦5G及未来网络中的非正交多址接入(NOMA)技术,通过MATLAB仿真帮助理解功率域多址与串行干扰消除(SIC)的核心机制。压缩包共3个文件&#xff0…

2026/9/23 16:32:28 阅读更多 →
go-judge判题机从部署到多语言评测:沙箱与API配置实战指南

go-judge判题机从部署到多语言评测:沙箱与API配置实战指南

简介:围绕 GoJudge 判题机部署与调用的中文实践指南,面向需要使用云服务器搭建 OJ 在线评测系统、但对官方文档深感资料不足的开发者与运维人员。原文结合作者实际搭建经验,整理出直接服务器部署与 Docker 部署两条路线,并补充 go…

2026/9/23 16:32:28 阅读更多 →
分布式存储选型与落地:Ceph、MinIO、JuiceFS实战避坑指南

分布式存储选型与落地:Ceph、MinIO、JuiceFS实战避坑指南

简介:本资源是一份面向互联网与计算机专业学习者、系统架构初学者及企业IT技术人员的分布式存储技术深度解析文档,聚焦大数据时代下海量数据的高效存储与扩展难题。文档系统梳理结构化数据(关系型数据库)的垂直/水平切分策略、非结…

2026/9/23 16:31:28 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →