[739]每日温度
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]
提示:
1 <= temperatures.length <= 10530 <= temperatures[i] <= 100
Related Topics
- 栈
- 数组
- 单调栈
2、题目分析
求当前元素后续第一个更高值的位置。
第1种方法,遍历到当前位置时,实时处理出结果,即暴力法,二层循环
第2种方法,本质是以空间换时间。遍历到当前位置时,先不处理当前位置的结果,先存起来,接着遍历。再用后续遍历到的元素和之前存起来的元素进行对比。此时如果此前存起来的元素被处理出结果,则不需要再存着。
3、解题步骤
1、遍历温度数组
2、对于每个元素,执行以下操作:
- 如果栈为空或者当前元素小于等于栈顶元素,说明当前元素是第一个更高的温度,将当前元素的下标入栈。
- 如果栈不为空且当前元素大于栈顶元素,说明找到了一个更高的温度,计算当前元素与栈顶元素的下标差值,并将结果存储到 answer[stack.peek()] 中。然后将栈顶元素出栈。接着对比新的栈顶元素与当前元素
4、复杂度最优解代码示例
public static int[] dailyTemperatures(int[] temperatures) {
Stack<Integer> stack = new Stack<>();
int[] answer = new int[temperatures.length];
for (int i = 0; i < temperatures.length; i++) {
// 1、遍历温度数组
while (stack.size() > 0 && temperatures[stack.peek()] < temperatures[i]) {
// 2、对于每个元素,执行以下操作:
// - 如果栈为空或者当前元素小于等于栈顶元素,说明当前元素是第一个更高的温度,将当前元素的下标入栈。
// - 如果栈不为空且当前元素大于栈顶元素,说明找到了一个更高的温度,计算当前元素与栈顶元素的下标差值,并将结果存储到 answer[stack.peek()] 中。然后将栈顶元素出栈。接着对比新的栈顶元素与当前元素
int dest = i - stack.peek();
answer[stack.pop()] = dest;
}
stack.push(i);
}
return answer;
}
5、抽象与扩展
什么时候用单调栈?
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。
文章讲述了如何使用单调栈算法解决给定整数数组表示的每日气温问题,求出每个温度之后的第一个更高温度出现的天数。作者提供了详细的解题步骤、代码示例,并阐述了何时使用单调栈解决此类问题。

661

被折叠的 条评论
为什么被折叠?



