根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请输入 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的都是 [30, 100] 范围内的整数。
第一种直接对本次温度后面的温度进行遍历,直至找到温度大于当前温度。
public static int[] dailyTemperatures(int [] T) {
int [] dailyT = new int [T.length];
for(int i =0 ; i < T.length - 1; i++) {
int temp = 0;
for(int j = i+1; j <T.length ;j++) {
if(T[i] < T[j]) {
temp = j - i;
break;
}
}
dailyT[i] = temp;
}
dailyT[T.length-1] = 0;
return dailyT;
}
第二种利用栈,只走一遍温度数组。 栈用来记录温度下标,当温度高于栈顶下标对应温度时出栈,天数为 当前温度下标-栈顶下标
public static int[] dailyTemperatures(int [] T) {
int [] dailyT = new int [T.length];
Arrays.fill(dailyT, 0);
Stack <Integer> stack = new Stack <Integer> (); //栈来记录 温度的下标。
for(int i =0 ; i < T.length ; i++) {
while(!stack.isEmpty() && T[stack.peek()] < T[i]) {
int t = stack.pop();
dailyT[t] = i - t ; // i为大于当前出栈的温度下标,减去当前下标即为天数。
}
stack.push(i); //在stack为空和栈顶温度大于T[i]时候,将下标进栈。
}
return dailyT;
}