739. 每日温度
给定一个整数数组 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
本题为计算出现下一个最高温度的天数,我们只需要知道某个相对过去较高的天(下标)即可得到与之相差的天数,可以使用栈进行结果的收集。
代码如下:
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length;
int[] ans = new int[n];
Stack<Integer> stack = new Stack<>();
// 从后往前遍历
for (int i = n - 1; i >= 0; i--) {
int current = temperatures[i];
//当前温度大于栈顶温度 就将队尾去掉(左侧比右侧温度高,说明当前可能为峰值)
while (!stack.isEmpty() && current >= temperatures[stack.peek()]) {
stack.pop();
}
//经过上述循环处理后当前栈顶数值大于当前此时计算结果
if (!stack.isEmpty()) {
ans[i] = stack.peek() - i;
}
stack.push(i);
}
return ans;
}```
正序遍历,使用栈记录出现的最高温度的数组下标,只有出现比之前出现的温度更高时进行结果的赋值并将栈中元素弹,出直到当前比历史的还要低(说明从之前到现在还没有比历史更高的温度)。
```java
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++) {
int current = temperatures[i];
// 使用栈进行操作 只有出现栈顶记录值小于当前值时进行计算
while (!stack.isEmpty() && current > temperatures[stack.peek()]) {
// 出现比之前要高的温度 将记录的历史最大值弹出
int history = stack.pop();
// 计算结果 此时为大于历史的最大温度 也就是过去遇到当前较大温度的天数
ans[history] = i - history;
}
// 将数组元素入栈
stack.push(i);
}
return ans;
}
运行结果如下:
(含有注释效果会低,去掉注释后内存由提升)
个人见解不喜勿喷!!!