一、题目描述
根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/daily-temperatures
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、朴素解法
class Solution {
public int[] dailyTemperatures(int[] T) {
int len=T.length;
int []res=new int[len];
res[len-1]=0;
for(int i=0;i<len-1;i++){
if(isReduce(T,i)==true){res[i]=0;continue;}
int j=i+1;
for(;j<len;j++){
if(T[j]>T[i]) break;
}
res[i]=j-i;
}
return res;
}
public boolean isReduce(int []A,int i){
int now=A[i];
for(int j=i+1;j<A.length;j++){
if(A[i]<A[j])return false;
}
return true;
}
}
三、单调栈解法
1.单调栈概述
出栈元素按单调递增规律出栈为单调递增栈;
出栈元素按单调递减规律出栈为单调递减栈。
2.分析
栈中存的是下标。若 待入栈下标 所对应元素A 大于 栈顶元素所对应的值B,则栈顶元素的下一个较高温度找到,它可以出栈了(较高温度下标入栈成为待比较);接着比较下一个栈顶元素,直到栈为空。若 待入栈下标 所对应元素A 小于或等于 栈顶元素所对应的值B,直接入栈等待处理。
纵观本题始终在维护局部的单调栈。
3.解答
class Solution {
public int[] dailyTemperatures(int[] T) {
int len=T.length;
Stack<Integer> s=new Stack<Integer>();
s.push(0); //栈中存放数组下标
int []res=new int[len];
for(int i=1;i<len;i++){
while(!s.empty()&&T[i]>T[s.peek()]){
int tmp=s.pop();
res[tmp]=i-tmp; //下标tmp的结果值为i-tmp
}
s.push(i);
}
return res;
}
}
四、补充例题