😳

每日温度

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

示例

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

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

思路

简单的说就是找到右边第一个比自己大的元素,可以使用单调栈来解决这个问题。

如何构造这个单调栈,需要明确这个栈的特点:

  • 存放从栈头到栈底递增的元素
  • 栈中存放元素的下标,然后通过temperatures[i]来访问元素

遍历到元素i时,先与栈顶元素j比较,若比栈顶元素大,则将栈顶元素弹出,并记结果数组ans[j]=i-ji-j为他们之间的距离,迭代直到元素不比栈顶元素大时,将元素压入栈中,这样就保持了栈的单调性,下面是图解:

image-20220723134148321

因为数组默认值0,所以76、73不用出栈都行

实现代码

class Solution {
    public int[] dailyTemperatures(int[] temperatures) {
        int n=temperatures.length;
        Deque<Integer> stack=new ArrayDeque<>();
        int[] ans=new int[n];
        for(int i=0;i<n;i++) {
            while (!stack.isEmpty()&&temperatures[i]>temperatures[stack.peek()]) {
                int index=stack.pop();
                ans[index]=i-index;
            }
            stack.push(i);
        }
        return ans;
    }
}