【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈

LeetCode 739. 每日温度

📌 题目描述

题目级别:中等

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

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

💡 破题思路:从右向左维护单调递减栈

寻找"下一个更大的元素",是单调栈 的绝对主场。

我们采用从右向左倒序遍历数组的方式。

核心逻辑:

假设我们站在某一天,往右看。如果右边有一座"高山"(高温),那么这座高山背后的"小丘陵"(低温)我们就永远看不到了------因为只要我们在找"比今天高的温度",那座高山一定会先满足要求,背后那些比较矮的温度彻底失去了被用作答案的价值。

因此,我们可以维护一个栈:

  1. 遇到当天的温度,就把它和栈顶的温度比较。
  2. 如果栈顶的温度 小于等于 当天温度,说明栈顶的温度变成了"毫无价值的矮丘陵",直接弹出 (pop) 淘汰!
  3. 一直弹,直到栈空了,或者栈顶遇到了一个比当天温度高的"高山"。
  4. 此时,栈顶的那天就是我们要找的"下一个更高温度"。距离就是 栈顶天数 - 当天天数
  5. 最后,把当天的天数压入栈中,作为后续天数可能的"高山"。

极客优化:

栈中不需要同时存入温度和天数(不需要用 pair)。只存天数(索引)即可! 因为有了索引,随时可以通过 temperatures[st.top()] 拿到对应的温度。


💻 C++ 代码实现 (仅存下标极简版)

cpp 复制代码
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();
        vector<int> res(n, 0); // 初始化为 0
        stack<int> st;         // 栈中只存天数下标!

        // 从最后一天开始往前推
        for (int i = n - 1; i >= 0; i--) {
            // 只要栈顶的那天温度不如今天热,栈顶就永远失去了作为"未来更高温"的资格,弹栈淘汰
            while (!st.empty() && temperatures[st.top()] <= temperatures[i]) {
                st.pop();
            }
            
            // 弹完之后,如果栈没空,栈顶就是离今天最近的、比今天热的那天
            if (!st.empty()) {
                res[i] = st.top() - i;
            }
            
            // 把今天压入栈中,等待前面日子来仰望
            st.push(i);
        }

        return res;
    }
};
相关推荐
rannn_1116 小时前
【力扣hot100】链表专题|160、206、234、141、142
java·算法·leetcode·链表·面试·开发
数模竞赛Paid answer6 小时前
2026年华东杯数学建模B题医药物流安排问题解题全过程文档及程序
算法·数学建模·数据分析·华东杯
不会代码的小猴7 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
营养充电站7 小时前
VS Code Git 工作树:解锁多分支并行开发的高效体验
leetcode·决策树·逻辑回归·散列表·模拟退火算法
青瓦梦滋7 小时前
传输层UDP/TCP协议
linux·网络·c++·网络协议·tcp/ip·udp
AI备案指南-满满8 小时前
大模型与算法备案全流程详解:从零到通过的完整指南
人工智能·算法·备案·大模型备案·算法备案
江畔柳前堤8 小时前
LLM 训练核心机制深度解析:Warmup、Cosine Decay 与 Perplexity 的完整知识体系
网络·人工智能·深度学习·算法·机器学习·语音识别
一只旭宝8 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
良木林8 小时前
子串 - LeetCode hot 100
算法·leetcode·职场和发展