【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;
    }
};
相关推荐
leobertlan3 小时前
痛苦系列 | DSP-03 跨越单位圆:Z变换与零极点分析
算法·程序员
蛋蛋的就会顺顺的3 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
开发小能手1234 小时前
答案daanC语言
数据结构·算法
Navigator_Z5 小时前
LeetCode //C - 1291. Sequential Digits
c语言·算法·leetcode
WL学习笔记6 小时前
C & C++ 内存管理
c++·c++内存管理
pride.li7 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
旺仔仔仔7 小时前
机器人项目实战(5):从单次抓取,到接收指令连续做事
算法
旺仔仔仔8 小时前
机器人项目实战(2):识别物体、提取点云,再到抓取姿态
算法
姜鱼问生8 小时前
密码明明一样,为什么 GPG 说“错的“?
后端·算法·架构
启观川8 小时前
数据结构与算法-第 3 章 常用算法-贪心算法
数据结构·笔记·python·算法·贪心算法