给定一个整数数组?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
求当前元素后续第一个更高值的位置。
第1种方法,遍历到当前位置时,实时处理出结果,即暴力法,二层循环
第2种方法,本质是以空间换时间。遍历到当前位置时,先不处理当前位置的结果,先存起来,接着遍历。再用后续遍历到的元素和之前存起来的元素进行对比。此时如果此前存起来的元素被处理出结果,则不需要再存着。
1、遍历温度数组
2、对于每个元素,执行以下操作:
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;
}
什么时候用单调栈?
通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。