每日温度-算法详细分析

每日温度:

根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,
请在该位置用 0 来代替。

例如,
给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

import java.util.Stack;

/**

@author cosefy

@date 2020/6/11

*/
public class DailyTemperature {
public static void main(String[] args) {
    int[] T = {73, 74, 75, 71, 69, 72, 76, 73}; //结果:1 1 4 2 1 1 0 0
    int[] Tem1 = dailyTemperature_Test1(T);
    int[] Tem2 = dailyTemperature_Test2(T);
    for (int i : Tem1) {
        System.out.print(i + " ");
    }
    System.out.println("");
    System.out.println("------------------");
    for (int i : Tem2) {
        System.out.print(i + " ");
    }
}


解法一:暴力解法

思路:双重循环遍历数组,找到当前元素后面第一个大于它的元素,就跳出循环,找不到默认为0.
分析:时间复杂度为O(n*n),空间复杂度为O(n).效率比较低

public static int[] dailyTemperature_Test1(int[] T) {
    int[] res = new int[T.length];
    for (int i = 0; i < T.length; i++) {
        for (int j = i + 1; j < T.length; j++) {
            if (T[i] < T[j]) {
                res[i] = j - i;
                break;
            }
        }
    }
    return res;
}
解法二:利用栈的辅助

思路:此处栈中只存数组下标,并且下标所代表的元素是递减的。遍历数组,如果栈不空,且当前元素大于栈顶元素,则出栈,
计算下标差值存入返回数组,直到栈顶元素大于当前元素或栈为空;如果栈为空,或者栈顶元素大于当前元素,则把当前元素
的下标入栈.
分析:时间复杂度O(n),空间复杂度O(n)

public static int[] dailyTemperature_Test2(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 record_num = i-stack.peek();       //while每次循环中,不要出栈两次
            res[stack.pop()]=record_num;
        }
        stack.push(i);
    }
    return res;
}

}
原文地址:https://www.cnblogs.com/cosefy/p/13097375.html