单调栈——739. 每日温度

204 阅读2分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

题目描述

请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

思路描述

如果是穷举的话,作为一个O(n2n^2)复杂度,这道题并没有什么难处。然而也可以用更加简单的方式,单调栈。

单调栈顾名思义,就是既满足后进先出,又满足栈内元素单调的数据结构。很多人在理解了单调栈的意思后并不能灵活的使用这个算法解题。不妨用笨方法思考这个问题。

单调栈是单调递增还是单调递减?

本题需要获取每一天要等几天才会有更高的温度。如果单调递增的存,那么73入栈,74入栈,75入栈。71的时候前者出栈。我们确实可以求出73,74有一天才会有更高温度。但是75在一直计算到temperatures[6]=76时依旧不可知。

因此需要单调递减的存。

  • 73入栈,
  • 73出栈74入栈 获得结果73前面是1天,
  • 74出栈75入栈 获得结果74前面是1天,
  • 71入栈,
  • 69入栈,
  • 69出栈71出栈 获得结果69前面是1天,获得结果71前面是2天。72入栈。
  • 以此类推。 我们会在出栈时得到他前面还有几天才会出现更高温度

具体实现

vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int> stk;
        int length = temperatures.size();
        vector<int> arr(length);

        for(int i = 0; i < temperatures.size(); i++){
            while(!stk.empty() && temperatures[stk.top()] < temperatures[i]){
                int tmp = stk.top();
                stk.pop();
                arr[tmp] = i - tmp;
            }
            stk.push(i);
        }
        return arr;
    }

总结

使用单调栈是单调递增还是单调递减? 这种笨方法自然躲避了新手不能灵活使用问题,也在已知题目可用单调栈解的时候可以轻松做出来,但是实际上对学习本身是并不负责的,接下来通过几期同样的单调栈题的解答努力寻找这类题的共性。