这里是题目描述:LeetCode-739.每日温度
本题最直观的解法是两层循环遍历:外层循环遍历到某一天的气温T[i]
时,内层循环从i+1
开始向前遍历,直到有大于T[i]
的气温,记录这一天和i的差值,就是超过第i
天气温需要的天数;如果一直遍历到T
末尾也没有比T[i]
高的气温,则将需要天数记为0
但是本题气温列表T
的长度为[1,30000]
,也就是说问题的最大规模n
为30000
,上面所描述的直观方法时间复杂度为O(n2),会超出时间限制
为了降低时间复杂度,我们使用一个“栈”结构,来记录已经遍历过,但还没有确定超过这一天气温所需天数的日期
借助栈完成的线性时间复杂度解法
使用一个“栈”结构,来记录已经遍历过,但还没有确定超过这一天气温所需天数的日期,也就是栈中存储相应日期在气温列表中的索引。并将栈中的日期对应的气温和当前遍历到的气温比较,若栈中日期的气温较低,则出栈,同时记录超过出栈日期气温所需的天数是当前日期-出栈日期
,直到栈顶日期气温不大于当前气温或栈为空,此时将当前日期入栈。遍历完气温列表后,将存在栈中的元素的所需天数设置为0
题解代码:
class Solution {
public int[] dailyTemperatures(int[] T) {
Stack<Integer> stack=new Stack<>();
int[] result=new int[T.length];
for(int i=0;i<T.length;i++)
{
while(!stack.isEmpty())
{
int index=stack.peek();
if(T[i]>T[index])
{
stack.pop();
result[index]=i-index;
}
else
{
break;
}
}
stack.push(i);
}
while(!stack.isEmpty())
{
result[stack.pop()]=0;
}
return result;
}
}
时间复杂度:O(n)
空间复杂度:O(n)