739. 每日温度
请根据每日 气温
列表 temperatures
,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 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]
遍历整个数组,如果栈不空,且当前数字大于栈顶元素,那么如果直接入栈的话就不是 递减栈 ,所以需要取出栈顶元素,由于当前数字大于栈顶元素的数字,而且一定是第一个大于栈顶元素的数,直接求出下标差就是二者的距离。
继续看新的栈顶元素,直到当前数字小于等于栈顶元素停止,然后将数字入栈,这样就可以一直保持递减栈,且每个数字和第一个大于它的数的距离也可以算出来。
链接:https://leetcode-cn.com/problems/daily-temperatures/solution/leetcode-tu-jie-739mei-ri-wen-du-by-misterbooo/
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
if(temperatures == null || temperatures.length == 0)
return temperatures;
Stack<Integer> stack = new Stack<>();
for(int i = 0; i< temperatures.length; i++){
// 当前元素与栈顶元素比较,如果比栈顶元素大,则继续出栈比较,
// 直到栈顶元素比当前元素大或者栈为空结束本次比较
while(!stack.isEmpty()
&& temperatures[stack.peek()]< temperatures[i]){
temperatures[stack.peek()] = i - stack.peek();
stack.pop();
}
stack.push(i); // 进入栈的元素一定比之前栈元素小(栈里的元素是单调递减的)
}
while(!stack.isEmpty()){ // 栈里有的元素没有找到比自己本身位置还高的
temperatures[stack.pop()] = 0;
}
return temperatures;
}
}