739. 每日温度 LeetCode 热题 HOT 100

目录

过程解析

一、题目理解

给定一个数组,表示连续几天的气温。

要求输出一个同样长度的数组,其中第 i 个元素表示:

从第 i 天起,至少需要等待多少天 才会出现比第 i 天更高的温度

如果之后再也没有更高温度,则输出 0

例如:

输入 73, 74, 75, 71, 69, 72, 76, 73

输出 1, 1, 4, 2, 1, 1, 0, 0

解释:

  • 第 1 天(73)→ 下一天 74 更高 → 等 1 天;
  • 第 2 天(74)→ 下一天 75 更高 → 等 1 天;
  • 第 3 天(75)→ 要等到 76 (第 7 天)→ 等 4 天;
  • ...依此类推。

二、核心思路

这题的关键在于:为每一天找到"右边第一个比它大的温度"

直接两层循环比对虽然能做,但时间复杂度是 O(n²),在数据量大时会超时。

于是可以使用一种经典的数据结构------单调栈(Monotonic Stack)


三、单调栈思想

1. 栈的作用

我们维护一个栈,里面存放还没找到更高温度 的"天数下标"。

栈从底到顶保证:对应的温度是递减的

2. 遍历数组的过程

当我们从左到右依次查看每一天时:

  • 如果当天温度 ≤ 栈顶下标对应的温度:

    表示当前还没有更高温度,把当天下标压入栈,等待后续更高的温度。

  • 如果当天温度 > 栈顶下标对应温度:

    说明当前这一天就是栈顶那天的"更高温度"。

    我们可以计算两天的间隔天数:

    当前天数索引 - 栈顶天数索引。

    然后弹出栈顶,因为它已经找到了答案。

    接着继续判断新的栈顶(可能连续几个更低温度都会被解决)。

这样,每个元素最多进栈一次、出栈一次,所以整个过程是 O(n) 的。


四、示例讲解

以输入数组:

73, 74, 75, 71, 69, 72, 76, 73

步骤演示
步骤 当前天数 当前温度 栈中下标(对应温度) 操作 结果变化
1 0 73 栈为空,入栈 0 栈 → 0
2 1 74 0(73) 74 > 73,弹 0,ans0=1 栈 → 1
3 2 75 1(74) 75 > 74,弹 1,ans1=1 栈 → 2
4 3 71 2(75) 71 ≤ 75,入栈 3 栈 → 2, 3
5 4 69 2(75), 3(71) 69 ≤ 71,入栈 4 栈 → 2, 3, 4
6 5 72 2(75), 3(71), 4(69) 72 > 69 → 弹 4 (ans4=1),72 > 71 → 弹 3 (ans3=2),栈顶 75 > 72 → 停止,入 5 栈 → 2, 5
7 6 76 2(75), 5(72) 76 > 72 → 弹 5 (ans5=1),76 > 75 → 弹 2 (ans2=4),栈空,入 6 栈 → 6
8 7 73 6(76) 73 ≤ 76,入 7 栈 → 6, 7

遍历结束后,栈中 6 (76) 和 7 (73) 没有找到更高温度,保持默认值 0。

最终答案: 1, 1, 4, 2, 1, 1, 0, 0


五、算法总结

  • 算法类型:单调栈(递减栈)

  • 时间复杂度:O(n)(每个元素最多进栈一次、出栈一次)

  • 空间复杂度:O(n)(栈与答案数组所占空间)

  • 适用场景

    • 寻找"右侧第一个比当前值更大/更小"的元素
    • 常用于温度、股票、地形等类似问题

代码

C++

cpp 复制代码
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int count = temperatures.size();
        vector<int> ans(count,0);
        stack<int> st;
        for(int i = 0;i<count;i++){
            while(!st.empty()&&temperatures[i]>temperatures[st.top()]){
                auto index = st.top();
                st.pop();
                ans[index] = i - index;
            }
            st.push(i);
        }
        return ans;
    }
};

C语言

c 复制代码
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize) {
    int* ans = (int*)calloc(temperaturesSize, sizeof(int));
    int* stack = (int*)malloc(sizeof(int) * temperaturesSize);
    int top = -1;

    for (int i = 0; i < temperaturesSize; i++) {
        while (top >= 0 && temperatures[i] > temperatures[stack[top]]) {
            int index = stack[top--];
            ans[index] = i - index;
        }
        stack[++top] = i;
    }

    *returnSize = temperaturesSize;
    free(stack);
    return ans;
}
相关推荐
先吃饱再说18 小时前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰21 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术1 天前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六1 天前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术1 天前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize1 天前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考2 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
美团技术团队2 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法
To_OC3 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode