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

相关推荐
专注仿真3 小时前
知识问答模型用到的算法集详解及代码实例
python·算法·代码·大模型训练·控制算法
罗西的思考4 小时前
【轻量化复刻大模型 / KIMI K3】AttnRes 模块交互式演示
人工智能·算法·机器学习
好悬给我拽开线8 小时前
ZILOT 论文解析
算法
饮水桶_T9 小时前
JAVA IO流笔记
开发语言·数据结构·算法
星夜离尘5610 小时前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi10 小时前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
鸿蒙开发爱好者10 小时前
下班后做的小工具和小游戏,我把它们整理成了 WyanHub
网络·人工智能·职场和发展·个人开发
地平线开发者10 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
csdn_aspnet11 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞11 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力