题目:
请根据每日气温列表 temperatures ,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0来代替。
1.输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
2.输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]
3.输入: temperatures = [30,60,90]
输出: [1,1,0]
提示:
1 <= temperatures.length <= 105
30 <= temperatures[i] <= 100
分析:
以temperatures = [73,74,75,71,69,72,76,73]为例
步骤 | 温度 | 栈 | 等待天数 | 注释 |
---|---|---|---|---|
1 | 73 | [0] | [0,0,0,0,0,0,0,0] | 0入栈 |
2 | 74 | [1] | [1,0,0,0,0,0,0,0] | 73和74比较,0出栈,1入栈 |
3 | 75 | [2] | [1,1,0,0,0,0,0,0] | 74和75比较,1出栈,2入栈 |
4 | 71 | [2,3] | [1,1,0,0,0,0,0,0] | 71和75比较,3入栈 |
5 | 69 | [2,3,4] | [1,1,0,0,0,0,0,0] | 69和71比较,4入栈 |
6 | 72 | [2,5] | [1,1,0,2,1,0,0,0] | 72和69比较,4出栈 72和71比较,3出栈 72和75比较,5入栈 |
7 | 76 | [6] | [1,1,4,2,1,1,0,0] | 76和72比较,5出栈 76和75比较,2出栈 6入栈 |
8 | 73 | [6,7] | [1,1,4,2,1,1,0,0] | 73和76比较,7入栈 |
该题利用一个栈保存每天的温度在数组中的下标,每次从数组中读取一个温度,然后将其与栈中保存的温度(根据下标的温度进行比较)进行比较,如果当前温度比位于栈顶的温度高,那么就知道位于栈顶的那一天需要等待几天就会出现更高的温度,然后出栈一次,将当前温度和下一个位于栈顶的温度进行比较。如果栈中已经没有比当前温度低的温度,那么就将当前温度在数组中的下标入栈。
如果输入数组的长度为n,虽然上述代码有一个嵌套的二重循环,但它的时间复杂度是O(n),因为数组中每个温度入栈出栈各一次,空间复杂度也是O(n)。
代码:
import java.util.Stack;
public class DailyTemperatures {
public int[] dailyTemperatures(int[] temperatures){
int[] result = new int[temperatures.length];
Stack<Integer> stack = new Stack<>();
for (int i = 0; i < temperatures.length; i++) {
while (!stack.empty()&&temperatures[i] > temperatures[stack.peek()]){
int p = stack.pop();
result[p] = i - p;
}
stack.push(i);
}
return result;
}
}