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),最坏情况下温度一直下降,所有下标都会留在栈中。

相关推荐
lvwangshu1 小时前
势能分析(摊还分析)
数据结构·数学·算法
盘古开天16662 小时前
PPO算法代码实战(三):PyTorch从零实现PPO求解CartPole
人工智能·pytorch·算法
yyy(十一月限定版)2 小时前
CF2138A Cake Assignment
算法
xqqxqxxq2 小时前
LeetCode Hot100 矩阵专题题解笔记
笔记·leetcode·矩阵
盘古开天16662 小时前
PPO算法原理详解(下):Clip机制深入剖析与实践指南
人工智能·算法·机器学习
All for pursuit.2 小时前
【贪心-4】581.最短无序连续子数组
数据结构·c++·算法·leetcode
weixin_307779133 小时前
从“人操作仪器”到“Agent 自主发现”:OPL 金属材料自驱动实验室 MVP 技术论述
开发语言·人工智能·算法·架构
释厄6233 小时前
01AB 基本元理——任何智能体的三元法理·0=1→0≠1法理跃迁为天理
人工智能·windows·算法·microsoft·机器学习
Omics Pro3 小时前
经典多组学整合算法→商用云平台
数据库·人工智能·算法·机器学习·自然语言处理