题目:
Given a list of daily temperatures
, produce a list that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0
instead.
For example, given the list temperatures = [73, 74, 75, 71, 69, 72, 76, 73]
, your output should be [1, 1, 4, 2, 1, 1, 0, 0]
.
Note: The length of temperatures
will be in the range [1, 30000]
. Each temperature will be an integer in the range [30, 100]
.
class Solution {
public int[] dailyTemperatures(int[] temp) {
//给定温度数组,产生一个集合,随着每天温度的输入,你必须等待多少个天才能回到更暖和的天气,如果不存在这样的天,则用0替代。
//思路:使用一个一个数组记录前面匹配过的数组和其对应的下标,下一个查找先从数组中找比其大于等于的数对应的下标。
//如果该下标小于当前下表,则该下标的后面继续查找
//注意:暴力解法会TLM
//用来存储下标的数组
int [] stack=new int[temp.length];
int top=-1;
int [] res=new int[temp.length];
for(int i=0;i<temp.length;i++){
//取栈顶元素
while(top!=-1&&temp[i]>temp[stack[top]]){
//比其小的元素
int index=stack[top--];
res[index]=i-index;
}
//将当前元素下标放入stack
stack[++top]=i;
}
return res;
}
}
分析2(Stack实现-易理解):
class Solution {
public int[] dailyTemperatures(int[] temp) {
//给定温度数组,产生一个集合,随着每天温度的输入,你必须等待多少个天才能回到更暖和的天气,如果不存在这样的天,则用0替代。
//思路:使用一个栈来存储之前完成匹配的下标
//注意:暴力解法会TLM
Stack<Integer> stack=new Stack<Integer>();
int [] res=new int[temp.length];
for(int i=0;i<temp.length;i++){
while(!stack.empty()&&temp[i]>temp[stack.peek()]){
int index=stack.pop();
res[index]=i-index;
}
//将下标存储
stack.push(i);
}
return res;
}
}