每日温度:
根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,
请在该位置用 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;
}
}