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;
}
相关推荐
超级码力6667 小时前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑7 小时前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind7 小时前
HashMap详解
算法·哈希算法·散列表
汉克老师8 小时前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
Yzzz-F10 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业11 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn11 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室12 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星12 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿13 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算