739. 每日温度

题目描述

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

输入数据

[73,74,75,71,69,72,76,73]

期望数据

[1,1,4,2,1,1,0,0]

分析

此种找到一个数大的值的第一个数问题,就是明摆着告诉你要用到单调栈
其实使用两次循环也可以,但是复杂度高,容易答题失败

  1. 什么是单调栈
    就是一个栈,里面的元素的大小按照他们所在栈内的位置,满足一定的单调性
  2. 本题如何利用单调栈
    维护一个单调递减的stack,stack内部存的是原数组的每个index。
    每当我们遇到一个比当前栈顶所对应的数大的数的时候,我们就遇到了一个“大数“。这个”大数“比它之前多少个数大我们不知道,但是至少比当前栈顶所对应的数大。
    我们弹出栈内所有对应数比这个数小的栈内元素,并更新它们在返回数组中对应位置的值。
    因为这个栈本身的单调性,当我们栈顶元素所对应的数比这个元素大的时候,我们可以保证,栈内所有元素都比这个元素大。
    对于每一个元素,当它出栈的时候,说明它遇到了自己的next greater element,我们也就要更新redult数组中的对应位置的值。如果一个元素一直不曾出栈,那么说明不存在next greater element,我们也就不用更新result数组了

参考代码

class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& T) {
        vector<int> result(T.size(),0);
        stack<int> q;
        for(int i = 0  ; i < T.size() ; ++i)
        {
            while(!q.empty()&&T[q.top()] < T[i])
            {
                result[q.top()] = i - q.top();
                q.pop();
            }
            q.push(i);
        }
        return result;
    }
};

欢迎访问我的博客,了解最新动态https://www.mckinleylu.com/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值