leetcode 739每日温度

cpp 复制代码
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        int n = temperatures.size();

        vector<int> ans(n);  // 结果集,记录每一天还要等几天才有更高温度
        stack<int> s;        // 单调栈,存放还没找到更高温度的下标

        for (int i = 0; i < n; i++) {

            // 当前温度 > 栈顶下标对应的温度
            // 说明栈顶那一天找到了之后第一个更高温度
            while (s.empty() == false && 
                   temperatures[i] > temperatures[s.top()]) {

                int pre = s.top();   // 取出之前那一天的下标
                s.pop();             // 已经找到答案,移出栈

                ans[pre] = i - pre;  // 计算相隔天数
            }

            // 当前这一天入栈,等待后面出现更高温度
            s.push(i);
        }

        return ans;
    }
};

总结

这道题使用的是单调递减栈 ,栈中存的是下标,不是温度。

核心逻辑就是:

复制代码
遍历当前温度 temperatures[i]

如果 当前温度 > 栈顶对应温度
        ↓
说明栈顶那一天找到更高温度
        ↓
ans[栈顶] = 当前下标 - 栈顶下标
        ↓
pop() 出栈
        ↓
继续比较新的栈顶

如果当前温度不能解决栈顶
        ↓
停止 pop

最后
        ↓
当前下标 i 入栈
等待以后更高的温度

最重要的代码模板可以记住:

复制代码
while (!s.empty() && 当前元素 > 栈顶元素) {
    // 处理栈顶
    s.pop();
}

s.push(当前元素);

这道题中因为需要计算距离多少天:

复制代码
ans[pre] = i - pre;

所以栈里必须保存下标 i。

时间复杂度:O(n),因为每个下标最多入栈一次、出栈一次。

空间复杂度:O(n),最坏情况下温度一直下降,所有下标都会留在栈中。

相关推荐
其实防守也摸鱼6 分钟前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机22 分钟前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS10039 分钟前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构
CV爱数码1 小时前
CT 重建从零开始(五):ASTRA Toolbox 上手——几何、投影器与算法
图像处理·算法·计算机视觉·ct
TunerT_TQ1 小时前
超立方体Ramsey(openai/math 家族171)H11攻坚日志|D60–D69:Star分组重数、二幂坐标群、奇偶入射语义与Site‑Level候选计数形式化闭环
算法
Rabitebla1 小时前
【系统性学习笔记】Linux 权限篇(二):文件属性、权限修改与目录权限的底层逻辑
linux·c++·笔记·学习·算法
远离UE42 小时前
半拉格朗日学习笔记 动力学 实时渲染
人工智能·算法
小郎君6582 小时前
MPTT 不是万能编号:一棵百万节点树的增删改与批量事务
算法
FPGA小徐2 小时前
【一生一芯 / PA】AM 核心文件逐行解析(上):从 start.S 到 gpu.c
前端·算法
Tairitsu_H3 小时前
[动态规划#1] 子数组 | 最大子数组和 | 环形子数组的最大和 | 乘积最大子数组 | 乘积为正数的最长子数组
算法·动态规划