lettcode 739: 每日温度

/**
 * @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;
}
posted @ 2020-06-12 11:28  枫叶艾辰  阅读(154)  评论(0编辑  收藏  举报