/**
* @Class DailyTemperatures
* @Description
* 请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数
* 如果气温在这之后都不会升高,请在该位置用 0 来代替。
* <p>
* 例如,给定一个列表temperatures= [73, 74, 75, 71, 69, 72, 76, 73],
* 你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
* <p>
* 提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
* @Author 10256137
* @Date 2020/6/11
**/
public class DailyTemperatures {
}
/* //解法1: 暴力求解,最后一个不需要判断,肯定为0
public int[] dailyTemperatures(int[] T) {
if (T == null || T.length == 0) {
return null;
}
int[] date = new int[T.length];
int i = 0,j =0;
for (i = 0; i < T.length; i++) {
date[i] = 0;
for (j = i+1; j < T.length; j++) {
if (T[i] < T[j]) {
date[i] = j-i;
break;
}
}
}
return date;
}*/
/* // 解法2: 利用已有结果
public int[] dailyTemperatures(int[] T) {
if (T == null || T.length == 0) {
return null;
}
// 从右向左遍历
int[] result = new int[T.length];
for (int i = T.length-2; i >= 0 ; i--) {
// [73, 74, 75, 71, 69, 72, 76, 73]
// 可以利用已有结果,跳过部分比较,以计算[75]为例,此时已计算号[71]=2,
// 下次再比较时就可以跳过[71]对比的2个元素,直接比较[72]
// 对于某个元素的result为0的情况,说明后面没有比该元素更大的值了,可以直接结束
for (int j = i+1; j < T.length ; j+= result[j]) {
if(T[j] > T[i]){
result[i] = j-i;
break;
}
else if(result[j] == 0){
//对于result[j]为0的情况,说明T[j]之后没有比T[j]大的元素了
result[i] = 0;
break;
}
}
}
return result;
}*/
// 利用栈的形式,只需要遍历一遍
public int[] dailyTemperatures(int[] T) {
if (T == null || T.length == 0) {
return null;
}
int top = -1; // 保存栈顶位置,
int[] stack = new int[T.length]; // 保存的是元素下标
int[] res = new int[T.length];
for (int i = 0; i < T.length; i++) {
// stack[++top] = i; // 放在此处就等于T[stack[top]] == T[i] 一直成立了
// 比较栈顶元素和当前元素
while (top>=0 && T[stack[top]] <T[i]){
int idx = stack[top--]; // 获取栈顶位置对应的元素下标
res[idx] = i- idx;
}
stack[++top] = i;
}
return res;
}