【LeetCode739】每日温度

1、题目描述

题目链接

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answeri 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

输入: temperatures = 73,74,75,71,69,72,76,73

输出: 1,1,4,2,1,1,0,0

示例 2:

输入: temperatures = 30,40,50,60

输出: 1,1,1,0

示例 3:

输入: temperatures = 30,60,90

输出: 1,1,0

提示:

1 <= temperatures.length <= 105

30 <= temperaturesi <= 100

2、基本思路

 如果采用最简单最暴力的方法,就是从当前位置i的下一个位置i+1出发,找到第一个j,使得temperaturesj > temperaturesi,这种方法最坏情况得时间复杂度为O(n^2)。那么,有没有更好得方法呢?答案是有的。

 采用单调栈的方法,维护一个从栈底到栈顶单调递减的序列,举个简单的例子,例如温度序列为【1,4,3,5,5,2,3,6】

  • 初始化,栈空;
  • 首先,栈空,1入栈(栈中元素1);
  • 第二个数4,与栈顶元素1比较,1<4,则出栈,且答案为res1=1,栈空结束比较,4入栈(栈中元素4);
  • 第三个数3,与栈顶元素4比较,4>3,3入栈;(栈中元素4,3);
  • 第四个数5,与栈顶元素3比较,3<5,3出栈,答案为res3=1;(栈中元素4);
  • 栈非空,继续与栈顶元素比较,4<5,4出战,答案为res2=2;(栈中元素\[\]);
  • 栈空,5入栈(栈中元素5);
  • 第五个元素5,与栈顶元素5比较,5>=5,5入栈,(栈中元素5,5);
  • 第六个元素2,与栈顶元素5比较,5>2,2入栈,(栈中元素5,5,2);
  • 第七个元素3,与栈顶元素2比较,2<3,2出栈,且答案为res6=1,(栈中元素5,5);
  • 栈非空,继续与栈顶元素5比较,5>3,3入栈,(栈中元素5,5,3);
  • 第八个元素6,与栈顶元素3比较,3<6,3出栈,且答案为res7=1,(栈中元素5,5);
  • 栈非空,与栈顶元素5比较,5<6,5出栈,且答案为res4=4,(栈中元素5);
  • 栈非空,与栈顶元素5比较,5<6,5出栈,且答案为res5=3,(栈中元素\[\]);
  • 栈为空且序列遍历结束
    最终答案为1,2,1,4,3,1,1,0

 同样,我们也可以维护一个从栈底到栈顶维护一个单调递减的序列,遍历的序列从右往左。

单调栈的基本思想------及时去掉无用的数据,保证栈中数据有序

3、代码实现

  • 方法一
cpp 复制代码
vector<int> solve1(vector<int> &temperatures)
{
    int n = temperatures.size();
    vector<int> res(n,0);
    stack<int> st;
    for(int i =0;i<n;++i)
    {
        int t = temperatures[i];
        while(!st.empty() && t> temperatures[st.top()])
        {
            res[st.top()] = i-st.top();
            st.pop() ;
        }
        st.push(i);

    }
    
    return res;

}
  • 方法二
cpp 复制代码
vector<int> solve(vector<int> &temperatures)
{
    int n = temperatures.size();
    vector<int> res(n,0);
    stack<int> st;
    for(int i =n-1;i>=0;i--)
    {
        int t = temperatures[i];
        while(!st.empty() && t>=temperatures[st.top()])
        {
            st.pop();
        }
        if(!st.empty())
        {
            res[i] = st.top()-i;
        }
        st.push(i);
    }
    return res;

}
相关推荐
可编程芯片开发3 小时前
基于MATLAB的PEF湍流风场生成器模拟与仿真
算法
罗西的思考4 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (9)--- Reward Judging
人工智能·算法·机器学习
2401_841495644 小时前
【数据结构】B+树
数据结构·数据库·c++·b+树·概念·结构·操作原理
Mr.HeBoYan5 小时前
一次持续三天才出现的丢包故障——深入解析 DPDK Memory Ordering、rte_ring 与 CPU Memory Barrier (下)
linux·网络·算法·架构·dpdk
wabs6666 小时前
关于图论【深度优先搜索的理论基础】
算法·深度优先·图论
皓月斯语6 小时前
【C++基础】三目运算符
开发语言·数据结构·c++
先吃饱再说7 小时前
LeetCode 101. 对称二叉树
算法
是Dream呀7 小时前
人眼看不出的伪造,AI如何识别?实测合合信息跨模态鉴伪与去反光技术
算法
QN1幻化引擎7 小时前
SFA 信号场注意力:用8KB参数换248x KV Cache压缩,边缘设备也能跑长序列
人工智能·算法·gitee·gitlab
剑锋所指,所向披靡!7 小时前
数据结构之拓扑排序
数据结构