1、力扣链接
https://leetcode.cn/problems/iIQa4I/description/
2、题目描述
请根据每日 气温 列表 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
3、解题思路
使用单调栈解题
4、解题过程
假设每日气温是一个个柱子。温度越高,柱子越高,从前往后看(平视),长的柱子会挡住短的柱子。我们只能看到更高的柱子。使用单调栈标识我们能看到的柱子。不能看到的会被从栈中移除。 假设数组长度是n
1、站在第n个柱子往后看。没有柱子了,所以最后一个肯定是0
2、站在第 n-1个柱子往后看,如果n-1 柱子更高那么就看不到最后一根柱子,所以ans[n-1] = 0 如果n-1 柱子更矮那么就能到最后一根柱子。他们之间的距离就是 (n-(n-1)) = 1 所以ans[n-1] = 1
3、以此类推
5、复杂度
5.1 时间复杂度:
O(n)
5.2 空间复杂度:
O(n)
6、代码:
public int[] dailyTemperatures(int[] temperatures) {
int len = temperatures.length;
int [] ans=new int[temperatures.length];
Stack<Integer> stack = new Stack<>();
//指针从后往前移动
for (int i = len-1; i >=0 ; i--) {
// 栈中的元素是 i 到 len-1 中 的元素,如果后面的元素小于当前元素,那么就会被当前元素遮住那么就可以删除被遮住的元素
while (!stack.isEmpty()&& temperatures[stack.peek()]<=temperatures[i]){
stack.pop();
}
//如果站为空说明栈内元素都小于当前元素.说明没有更高的气温了返回0
if (stack.isEmpty()){
ans[i]=0;
}else {
//找到了比当前更高的气温,计算距离
ans[i]=stack.peek()-i;
}
//记录当前元素所在位置,继续下一轮循环
stack.push(i);
}
return ans;
}