1.题目描述
每日温度
给定一个整数数组 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]
2.思路
2.1 代码
返回之后第一个比当前位置大的数的距离,因此考虑使用递减的单调栈来完成。
栈中存放数组的角标,当遍历 i 所指位置的数比栈顶数大时,i 位置为栈顶位置右边第一个比该位置值大数,此时弹出栈顶 pop,并且用 i 减去弹出值(i-pop)则为相距天数,即结果数组 ans[pop] = i - pop。
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int N = temperatures.length;
int[] ans = new int[N];
int[] stack = new int[N];
int stackIdx = -1;
for (int i = 0; i < N; i++) {
while (stackIdx != -1 && temperatures[stack[stackIdx]] < temperatures[i]) {
int pop = stack[stackIdx--];
ans[pop] = i - pop;
}
stack[++stackIdx] = i;
}
return ans;
}
}
2.2 测试结果
通过测试
3.总结
- 使用单调栈进行解答,并且栈中存放角标
- 当栈顶元素小于当前值时,弹出栈顶 pop
- (i-pop) 的值即为 pop 位置上的答案