当前位置: 首页 > news >正文

从零开始刷算法-单调栈-每日温度

一、题目概述

题目来源:LeetCode 739 - Daily Temperatures

题目要求:
给定一个整数数组 temperatures,表示每天的温度,返回一个数组 answer,其中 answer[i] 表示距离第 i 天之后,温度升高所需要的天数。如果之后没有更高的温度,则 answer[i] = 0

示例:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

二、思路分析

这道题的核心在于:

对于每一天 i,要找到右边第一个比它温度高的那一天

如果我们暴力查找,每个 i 都向右扫描,复杂度是 O(n^2),显然不行。
于是可以考虑使用一个**单调栈(Monotonic Stack)**来优化。


三、单调栈思路讲解

1️⃣ 从后往前遍历的原因

我们从右往左遍历数组,因为:

  • 当前天的右边温度都已经处理完;

  • 栈中存放的下标对应的温度都是“右边的天”,

  • 所以可以直接用栈顶判断“右边第一个更高温度”。

2️⃣ 栈中存什么?

栈中存放的是 下标 i,而不是温度值。
因为要计算天数差(st.top() - i)。

3️⃣ 如何维护栈的单调性?

我们希望栈中的温度是递减的(栈顶最小)。

  • 当前温度 t 如果比栈顶温度高,说明栈顶那天不可能成为任何左边天的答案,直接 pop 掉;

  • 否则说明栈顶那天温度比当前天高,可以计算答案。

4️⃣ 状态更新逻辑

伪代码逻辑如下:

for i 从右往左:当前温度 = t[i]while 栈不空 && 当前温度 >= 栈顶温度:弹栈(因为这些天对答案没贡献)if 栈不空:ans[i] = 栈顶下标 - i压入当前下标 i

四、完整代码实现

class Solution {
public:vector<int> dailyTemperatures(vector<int>& temperatures) {int n = temperatures.size();vector<int> ans(n);stack<int> st;  // 单调递减栈,存放下标for (int i = n - 1; i >= 0; i--) {int t = temperatures[i];while (!st.empty() && t >= temperatures[st.top()]) {st.pop();}if (!st.empty()) {ans[i] = st.top() - i;}st.push(i);}return ans;}
};

五、运行流程示例

以输入 [73,74,75,71,69,72,76,73] 为例:

i温度栈中下标(从栈底到栈顶)栈中对应温度ans[i]说明
773[7][73]0栈空,压入
676[][]076>73,弹出后压入
572[6,5][76,72]1栈顶温度76更高
469[6,5,4][76,72,69]1栈顶温度72更高
371[6,5,3][76,72,71]2下一个高温是72
275[6,2][76,75]4下一个高温是76
174[6,2,1][76,75,74]1下一个高温是75
073[6,2,1,0][76,75,74,73]1下一个高温是74

六、复杂度分析

  • 时间复杂度: O(n),每个元素最多被压栈和弹栈一次。

  • 空间复杂度: O(n),栈最多存储 n 个下标。


七、总结

特点说明
遍历方向从右往左更自然
栈结构单调递减栈
栈中存储温度下标
逻辑核心弹出无用天,栈顶即为最近更高温度
时间复杂度O(n)

💬 一句话总结:

单调栈的关键不是“栈”本身,而是“单调性”带来的剪枝。
我们用栈保证每次处理时,能立刻找到“右边第一个更大元素”。

http://www.dtcms.com/a/578949.html

相关文章:

  • 建设银行网银网站h5制作网页
  • 免费金融发布网站模板wordpress移动端顶部导航栏
  • 成都公司做网站西安做网站公司玖佰网络
  • 网站制作交易流程网站建设方案平台选择
  • 如何给网站划分栏目高端建站的公司
  • 做酱菜网站一元云淘网站开发
  • 柳州建网站互联网销售公司起名
  • 中信云 做网站公司注册地址是什么
  • 创业网站模板建设邯郸网站
  • 普中51单片机学习笔记-前言
  • 网站建设案例教程试卷优化网站改版
  • 网站建设的要点是什么意思网站建设工程师
  • 局域网问题排查手册
  • 【Java SE 基础学习打卡】01 计算机概述
  • MySQL 联合索引设计中字段顺序、区分度与优化器行为详解
  • 百度推广的网站怎么做哪些网站是做数据分析的
  • 家居装修企业网站源码个人网站方案建设书
  • 南阳网站推广价格青州哪里做网站
  • LMCache 实现细节与数据流转完全解析
  • codeforces1997(div.3)E F
  • linux下navicat无限重置试用期方法
  • vllm部署Qwen3-14B命令行参数配置详解
  • 数据库风险监测专题:让隐蔽的风险“看得见、控得住”
  • 做网站美工排版5种可以给网站带来流量的方式
  • Vue Router (基础知识)
  • 网站设计软件有哪些城乡建设网官方网站
  • 网站设计模板之家杭州高端网建
  • CRC8算法通用版本
  • 如何在微信公众号内部做网站建设速干裤移动网站
  • 保定seo建站盐亭网站建设