【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;
    }
};
相关推荐
不正经学生2 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥4 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲4 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
恋恋西风5 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx5 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
圣保罗的大教堂5 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
BizzZ_5 小时前
C++(22)——类型转换和IO流
开发语言·c++
晊晌_h6 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦6 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考7 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习