思路:
第一种方法,双循环,第一层循环拿出一个元素,第二层循环寻找最近比当前大的元素位置。
第二种方法:使用栈来实现。
-
初始化:
int[] ans
用来存储每一天之后多少天温度会升高。Stack<Integer>
用来存储那些还没有找到更高温度的天的索引。
-
遍历温度数组:
- 对于每一天,用
i
来索引当前天的温度。 - 检查栈是否为空,以及栈顶索引对应的温度是否小于当前天的温度。
- 如果栈顶元素对应的温度小于当前天的温度,说明找到了栈顶索引那一天之后的一个更高温度,栈顶元素出栈。
- 出栈操作同时计算出栈元素(之前天的索引)到当前天的距离(天数差),并将结果存储在
ans
数组的相应位置。 - 将当前天的索引推入栈中,表示这一天还没有找到更高的温度。
- 对于每一天,用
-
处理结束:
- 遍历完成后,栈中剩余的索引对应的天数都是未来没有更高气温的,但由于
ans
数组默认值为0,所以不需要额外操作。 - 返回结果数组
ans
。
- 遍历完成后,栈中剩余的索引对应的天数都是未来没有更高气温的,但由于
代码如下:
class Solution {public static int[] dailyTemperatures(int[] temperatures) {if (temperatures == null || temperatures.length == 0) {return null; // 如果输入为空或长度为0,直接返回null}int N = temperatures.length; // 数组的长度int[] ans = new int[N]; // 结果数组,存储等待天数Stack<Integer> stack = new Stack<>(); // 栈,用于存储索引for (int i = 0; i < temperatures.length; i++) {// 当栈不为空,且栈顶索引对应的温度小于当前温度时while (!stack.isEmpty() && temperatures[stack.peek()] < temperatures[i]) {Integer pop = stack.pop(); // 出栈,pop是前一天的索引ans[pop] = i - pop; // 计算pop那一天到当前温度升高那一天的天数差,存储到结果数组}stack.push(i); // 当前天的索引入栈}return ans; // 返回结果数组}
}