每日温度


题目描述

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 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;
        }
    };

文章作者: 瑾年
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 瑾年 !
 上一篇
拼写单词 拼写单词
题目描述给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。
下一篇 
地图分析 地图分析
题目描述你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域最远的海洋区域是是哪一个吗?请返回该海洋区域到离它最近的陆
  目录