题目:
给定一个整数数组
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]
思路分析:
使用单调栈完成这个题,单调栈,顾名思义,这个stack中只能存放比上一个数字大(小)的数字,这道题我的思路是使用一个单调递减的栈,使用Deque创建一个栈原因是速度快,时间复杂度低,首先,需要一个循环进行遍历数组temperatures,在遍历的途中进行判断,如果栈为空,则直接将温度对应的下标压入栈中,当其不为空的时候,用下标为 i 的temperatures与栈顶的数字对应的temperatures进行比较,如果 i 对应的temperatures大于栈顶的数字对应的temperatures,则将栈顶的数字pop出来,并将num数组中相对应的下标数字赋值为 i - 栈顶数字(相当于找到下一个比它temperatures高的那天),然后再次进入循环,继续向栈底方向进行判断。结束后将 i push到栈中;继续循环。结束后返回数组num。
详细代码如下:
注:并未抄袭,是写完之后才发现与官方题解一样!!!
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int[] num = new int[temperatures.length];
Deque<Integer> stack = new LinkedList<Integer>();
for(int i = 0; i < temperatures.length; i++) {
while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
num[stack.peek()] = i - stack.pop();
}
stack.push(i);
}
return num;
}
}