题目
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
方法1:双重循环
定义两个指针i,j,若T[j]>T[i], 则输出下标差
注意:因为int是java的基本数据类型,它的默认值是0
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
for(int i = 0; i < T.length-1; i++){
for(int j = i+1; j < T.length; j++){
if(T[i] < T[j]){
res[i] = j - i;
break;
}
}
}
return res;
}
}
方法2:单调栈
- 若当前数值 大于 栈顶元素对应的数值,则栈顶元素出栈,因为已经找到了距离它最近的 比它大的数字,两数对应的下标差就是应该输出的数
- 若小于等于,则进栈,形成一个递减栈
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];//数组记录的是下标的差值
Deque<Integer> deque = new LinkedList<Integer>();//单调栈, 若大于栈顶元素则出栈
for(int i = 0; i < T.length; i++){
int current = T[i];
while(!deque.isEmpty() && current>T[deque.peek()]){
int preIndex = deque.pop();//栈中记录的是数组下标
res[preIndex]=i-preIndex;
}
deque.push(i);
}
return res;
}
}