Daily Temperatures单调栈--力扣101算法题解笔记

11.4Daily Temperatures单调栈

题目描述

给定每天的温度,求对于每一天需要等几天才可以等到更暖和的一天,如果该天之后不存在更暖和的天气,则记为0。

输入输出样例

Input :{73, 74, 75, 71, 69, 72, 76, 73}

Output:1, 1, 4, 2, 1, 1, 0, 0

题解

我们可以维持一个单调递减的栈,表示每天的温度;为了方便计算天数差,我们这里存放位置(即日期)而非温度本身。我们从左向右遍历温度数组,对于每个日期 p,如果 p 的温度比栈顶存储位置 q 的温度高,则我们取出 q,并记录 q 需要等待的天数为 p - q;我们重复这一过程,直到 p 的温度小于等于栈顶存储位置的温度(或空栈)时,我们将 p 插入栈顶,然后考虑下一天。在这个过程中,栈内数组永远保持单调递减,避免了使用排序进行比较。最后若栈内剩余一些日期,则说明它们之后都没有出现更暖和的日期。

cpp 复制代码
#include <iostream>
#include <vector>
#include <stack>

using namespace std;

// 核心算法函数
vector<int> dailyTemperatures(vector<int>& temperatures) {
    int n = temperatures.size();
    vector<int> ans(n, 0); // 初始化为0,这样栈中剩余的元素自动对应结果0
    stack<int> indices;    // 单调栈,存储下标

    for (int i = 0; i < n; ++i) {
        // 当栈不为空,且当前温度高于栈顶下标对应的温度时
        while (!indices.empty() && 
            temperatures[i] > temperatures[indices.top()]) {
            int pre_index = indices.top();
            indices.pop();
            ans[pre_index] = i - pre_index; // 计算天数差
        }
        indices.push(i); // 将当前下标压入栈
    }
    return ans;
}

// 辅助函数:打印向量
void printVector(const vector<int>& vec) {
    cout << "[";
    for (size_t i = 0; i < vec.size(); ++i) {
        cout << vec[i];
        if (i != vec.size() - 1) {
            cout << ", ";
        }
    }
    cout << "]" << endl;
}

int main() {
    // 定义输入数据
    vector<int> temperatures = { 73, 74, 75, 71, 69, 72, 76, 73 };

    cout << "Input:  {73, 74, 75, 71, 69, 72, 76, 73}" << endl;

    // 调用函数
    vector<int> result = dailyTemperatures(temperatures);

    // 输出结果
    cout << "Output: ";
    printVector(result);

    return 0;
}
相关推荐
Benny_Tang1 分钟前
P7514 [省选联考 2021 A/B 卷] 卡牌游戏 题解
c++·算法
residual_fan8 分钟前
经验模态重构:直向工业时间序列数据的数据扩增方法
人工智能·算法·重构·数据挖掘·数据分析
aramae29 分钟前
模拟实现strcpy(字符串拷贝)(C语言)
java·c语言·开发语言·算法
Benny_Tang33 分钟前
「雅礼集训 2018 Day7」A 题解
数据结构·c++·算法
Doubbbbbbble云44 分钟前
跳表结构在高并发系统中的应用与优势分析4
算法
TAN-90°-1 小时前
Deep Learning for Computer Vision——Large Scale Distributed Training
人工智能·深度学习·神经网络·算法·机器学习·计算机视觉·语言模型
Lyyaoo.1 小时前
【回溯】【中等】全排列
java·数据结构·算法
写后端的胖头鱼1 小时前
一文讲懂JVM与调优
jvm·后端·算法·架构·jvm调优
土司大王1 小时前
LeetCode 79 单词搜索:Java 回溯模板、网格 DFS 与剪枝优化
java·算法·leetcode·深度优先
ECT-OS-JiuHuaShan1 小时前
哲学是迭代学,数学是拓扑学
开发语言·人工智能·学习·算法·机器学习·php·拓扑学