难度:中等
题目:请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
思路:第一种思路是暴力解法(不可取)。第二种思路:按照题目要求是,找出数组后面第一个比他大的数,并算出差值,放到res数组中保存,因此,我们可以使用单调栈来解决此问题。
可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的温度依次递减。如果一个下标在单调栈里,则表示尚未找到下一次温度更高的下标。
正向遍历温度列表。对于温度列表中的每个元素 T[i],如果栈为空,则直接将 i 进栈,如果栈不为空,则比较栈顶元素 prevIndex 对应的温度 T[prevIndex] 和当前温度 T[i],如果 T[i] > T[prevIndex],则将 prevIndex 移除,并将 prevIndex 对应的等待天数赋为 i - prevIndex,重复上述操作直到栈为空或者栈顶元素对应的温度小于等于当前温度,然后将 i 进栈。
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
Stack<Integer> stack = new Stack<Integer>();
stack.push(0);
for(int i=1;i<T.length;i++){
//先压入第一个位置的,下标
//看要压入的温度和栈顶温度进行对比,如果大,则弹出来,反之压入。
//单调栈,从底到顶,依次减小。
int tem = T[i];
while(!stack.isEmpty() && tem> T[stack.peek()]){
int index = stack.pop();
res[index] = i - index;
}
stack.push(i);
}
return res;
}
}
暴力解法(不推荐,仅作为验证):
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
for(int i=0;i<T.length-1;i++){
for(int j=i+1;j<T.length;j++){
if(T[j]>T[i]){
res[i] = j-i;
break;
}
}
}
res[T.length-1] = 0;
return res;
}
}