描述
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
示例 1:
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
分析
一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了
找右边的最近的比自己大的数值,然后计算距离。
借助单调栈找到右侧第一个比自己大的数值。栈存储的是数组元素的下标,方便后续计算距离。
找比自己第一个大的元素使用单调递增(从栈顶向栈底看)
步骤:
- 从左到右遍历数组,先押入第一元素的下标0
- 当前元素大于栈顶,一直弹出栈顶元素,直到为空或不再大于栈顶元素。
- 压入当前元素元素的下标
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int[] res = new int[temperatures.length];
Stack<Integer> stack = new Stack<>();
stack.push(0);
for(int i = 1; i < temperatures.length; i++){
while(!stack.isEmpty()&&temperatures[stack.peek()] < temperatures[i]){
res[stack.peek()] = i - stack.peek();
stack.pop();
}
stack.push(i);
}
return res;
}
}