- 「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。
1、单调栈介绍
- 单调栈:保持数字从栈底到栈顶、栈顶到栈低大小是有序排列的。
- 单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小。
- 单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大。
- 为了更好地了解和理解单调栈,可以借助下图。
单调栈题目应用(每日温度)
根据每日 气温 列表 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]
单调栈解题思路:根据题目要求,我们可以用单调递增栈来解题。当某一天的温度比它之前的温度都要高时,之前距之后具有更高温度的间隔天数都已经确定了,此时我们就不用关注之前的状态了。所以我们用单调递增栈,就可以很好地满足这一要求。当当前的温度等于或大于栈顶的温度时,进行弹栈操作,直到栈中的温度都要比当前的温度高时,就把当前温度进行进栈操作。具体代码以及注释如下。
题解代码
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length;
int[] res = new int[n];
Stack<int[]> stack = new Stack<>();
stack.push(new int[]{0,temperatures[0]});
for (int i = 1; i < n; i++) {
int[] day = stack.peek();
while (!stack.isEmpty() && temperatures[i] > day[1]) { // 温度比栈顶温度高,进行弹栈。
res[day[0]] = i - day[0]; // 计算两温度天数间隔。
stack.pop();
if (!stack.isEmpty()) day = stack.peek();
}
stack.push(new int[]{i,temperatures[i]}); // 无论哪一种情况,都要进行进栈操作。
}
return res;
}