LeetCode Hot100题目解析:栈结构实现每日温度(Java详细注释)
一、题目描述
给定一个整数数组 temperatures ,表示每天的温度。请你返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果之后没有更高的温度,答案就用 0 来代替。
示例:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
二、解题思路详解
本题需要找出每一天之后第一个比当天温度高的天数。因此我们可以使用 "单调栈",它适合解决这类“下一个更大元素”问题。
步骤讲解:
- 初始化结果数组:长度和temperatures一样,初始全部为0。
- 准备栈结构:用栈来存储温度的下标(而不是温度值)。
- 遍历数组:
- 对于每一天的温度,如果栈不空且当前温度高于栈顶所指的温度,说明找到了“下一个更高温度”,计算天数差并更新结果数组。
- 每处理完一个元素后,将当前下标压入栈,等待后续更高温度来处理。
- 遍历结束:栈中剩余的下标没有更高温度,结果已默认0。
形象理解:
- 栈中存储着“还没找到更高温度的那些天”,遇到更高温度就弹出并计算答案。
三、Java完整代码与详细注释
import java.util.Stack;
public class Solution {
/**
* 每日温度问题,使用单调栈
* @param temperatures 温度数组
* @return 每天距离下一个更高温度的天数
*/
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length;
int[] answer = new int[n]; // 结果数组,默认初始化为0
Stack<Integer> stack = new Stack<>(); // 存放下标
for (int i = 0; i < n; i++) {
// 如果当前温度高于栈顶所指的温度
while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
int prevIndex = stack.pop(); // 取出下标
answer[prevIndex] = i - prevIndex; // 计算天数差
}
stack.push(i); // 当前下标入栈
}
// 栈中剩余下标默认答案0
return answer;
}
}
代码说明:
- 栈里存的都是等待找到更热天的下标。
- 每次遇到更高温度,就弹出栈顶,计算答案。
- 时间复杂度O(n),每个元素最多进栈和出栈各一次。
四、小结
本题用单调栈解决,能高效查找每一个元素后面第一个更大的值,非常适合刷题和面试准备。
文章标签:LeetCode,算法,单调栈,Java,每日温度,数组,数据结构