每日温度

739. 每日温度 - 力扣(LeetCode)

给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

示例 1:

1
2
输入: temperatures = [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]

示例 2:

1
2
输入: temperatures = [30,40,50,60]
输出: [1,1,1,0]

示例 3:

1
2
输入: temperatures = [30,60,90]
输出: [1,1,0]

提示:

  • 1 <= temperatures.length <= 105
  • 30 <= temperatures[i] <= 100
单调栈

要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了

找右边第一个比自己大的元素,保持栈中元素从左到右递减

如果当前元素小于或等于栈顶元素,直接加入该元素,只需要加入下标即可

如果当前元素大于栈顶元素(此时就可以统计该元素是哪些元素右边的第一个大的元素),就把所有小于该元素的元素从栈顶依次出栈,当前元素下标-栈顶元素下标就是他们的距离

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
lass Solution {
public int[] dailyTemperatures(int[] temperatures) {
Stack<Integer> st = new Stack<>(); //单调栈
int[] ans = new int[temperatures.length];
//保持栈从左到右递减
for(int i = 0; i < temperatures.length; i++){
if(st.isEmpty() || temperatures[i] <= temperatures[st.peek()]){ //栈空或当前的值小于等于栈顶的值
st.push(i);
}else{//当前值大于栈顶元素
while(!st.isEmpty() && temperatures[i] > temperatures[st.peek()]){ //找到了栈顶元素左边第一个大的元素
ans[st.peek()] = i - st.peek();
st.pop();
}
st.push(i);
}
}
return ans;

}
}
  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$

每日温度
http://example.com/2023/10/15/算法/队列和栈/10. 每日温度/
作者
PALE13
发布于
2023年10月15日
许可协议