Given a list of daily temperatures T
, return a list such that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0
instead.
For example, given the list of temperatures T = [73, 74, 75, 71, 69, 72, 76, 73]
, your output should be [1, 1, 4, 2, 1, 1, 0, 0]
.
Note: The length of temperatures
will be in the range [1, 30000]
. Each temperature will be an integer in the range [30, 100]
.
用递减栈(Descending stack)来做,递减栈是说,栈中的元素,从底到顶,值是变小的。
思路:对数组进行遍历,每次在遍历过程中,入栈前,先遍历栈,判断当前值是否大于栈顶位置的值,如果大于,说明找到了需要的值,出栈,然后下标的差距就是需要的距离,直到栈顶位置的值小于等于当前值。
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
Stack<Integer> stack = new Stack();
for (int i = 0; i < T.length; i++) {
while (!stack.isEmpty() && T[i] > T[stack.peek()]) {
int idx = stack.pop();
res[idx] = i - idx;
}
stack.push(i);
}
return res;
}
}
还有一个策略就是从后往前遍历,这种遍历不是那么好理解。
栈中可能存在比当前值大的值,也可能没有。
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
Stack<Integer> stack = new Stack();
for (int i = T.length-1; i >=0; i--) {
while (!stack.isEmpty() && T[i] >= T[stack.peek()])
stack.pop();
if (!stack.isEmpty()) res[i] = stack.peek() - i;
stack.push(i);
}
return res;
}
}