【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;
    }
};
相关推荐
To_OC10 小时前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
05Kevin1 天前
lk每日冒险题--数据结构6.27
算法
To_OC1 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安2 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者2 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
卷无止境2 天前
C++ 的Eigen 库全解析
c++
卷无止境2 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端