大家好!我是曾续缘🤖
今天是《LeetCode 热题 100》系列
发车第 72 天
栈第 4 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
给定一个整数数组
temperatures
,表示每天的温度,返回一个数组answer
,其中answer[i]
是指对于第i
天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用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
解题方法
这个题目要求我们根据每天的温度,返回一个数组,数组中每个元素代表该温度之后下一个更高温度出现的天数。如果之后没有更高的温度,则用0来代替。
1. 使用栈
由于我们需要找到每个温度之后的下一个更高温度,我们可以使用单调栈的方法来进行处理。单调栈通常用于处理找下一个更大(或更小)元素的问题,其基本思路是维护一个单调递减(或递增)的栈,当遇到一个新元素时,不断地将栈顶元素与新元素比较,直到满足特定条件为止。
2. 从左到右遍历温度数组
我们遍历温度数组,对于每个温度,我们检查栈顶元素。
- 如果栈顶元素小于当前元素,说明我们找到了栈顶元素的下一个更高温度,我们将栈顶元素出栈,并将它对应的更高温度设置为当前索引减去栈顶元素的索引。
- 如果栈顶元素大于或等于当前元素,说明我们还没有找到栈顶元素的下一个更高温度,我们将当前元素进栈。
3. 清空栈
遍历结束后,栈中可能还剩下一些元素,这些元素说明在它们对应的索引位置之后没有更高的温度,所以我们将这些元素的对应结果设置为0。
Code
查看代码
java
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length; // 获取温度数组的长度
int[] ans = new int[n]; // 初始化结果数组
Stack<Integer> stack = new Stack<>(); // 初始化一个栈
for(int i = 0; i < n; i++){
// 遍历温度数组
while(!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]){
// 当栈顶元素小于当前元素时
int j = stack.pop(); // 弹出栈顶元素
ans[j] = i - j; // 在结果数组中记录下一个更高温度出现的天数
}
stack.push(i); // 将当前元素压入栈
}
while(!stack.isEmpty()){
ans[stack.pop()] = 0; // 在结果数组中记录没有更高温度的情况
}
return ans; // 返回结果数组
}
}