题目概览
给定一个整数数组temperatures,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第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 <= 10^530 <= temperatures[i] <= 100
来源:739. 每日温度 - 力扣(LeetCode)
解题分析
方法:单调栈
我们可以维护一个单调递减的栈,当当前元素大于栈顶元素时,就将小于当前元素的元素出栈,此时当前元素一定是第一个大于出栈元素的,出栈元素对应的answer 就是当前索引 - 该元素对应的索引。
时间复杂度:O(n)
空间复杂度:O(n)
class Solution { public int[] dailyTemperatures(int[] temperatures) { int n = temperatures.length; int[] res = new int[n]; Deque<Integer> dq = new LinkedList<>(); for (int i = 0; i < n; ++i) { int temp = temperatures[i]; while(!dq.isEmpty() && temperatures[dq.peek()] < temp) { int top = dq.pop(); res[top] = i - top; } dq.push(i); } return res; } }