【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;
    }
};
相关推荐
wabs6666 小时前
关于贪心算法的思考
算法·贪心算法
社交怪人7 小时前
【判断大小】信息学奥赛一本通C语言解法(题号1043)
算法
Snasph7 小时前
GNU Make 用户手册(中文版)
服务器·算法·gnu
江澎涌7 小时前
拆解与 AI 的一次对话
人工智能·算法·程序员
sheeta19988 小时前
LeetCode 每日一题笔记 日期:2026.06.02 题目:3635. 最早完成陆地和水上游乐设施的时间 II
笔记·算法·leetcode
Lsk_Smion8 小时前
力扣实训 _ [102].层序遍历--前序--后续_递归与非递归的实现
数据结构·算法·leetcode
小欣加油9 小时前
leetcode3751 范围内总波动值I
java·数据结构·c++·算法·leetcode
代码中介商10 小时前
C++左值与右值:核心判断法则详解
开发语言·c++
玖玥拾10 小时前
C/C++ 基础笔记(七)
c语言·c++
Halo_tjn10 小时前
反射与设计模式1
java·开发语言·算法