1. 法一:单调栈
- 单调栈(递增):入栈前,先出栈比它小的所有栈顶元素。保持栈单调递增
- 每一个元素入栈前,如果发现它>栈顶元素,说明他就是比栈顶这个气温高的第一个气温
- 当 i = 0时,单调栈为空,因此将0入栈
- stack = [0(73)]
- ans = [0,0,0,0,0,0,0,0]
- 当 i = 1 时,由于 74 大于 73,因此移除栈顶元素 0,赋值ans[0]:= 1 - 0, 将 1 进栈。
- stack = [1(74)]
- ans = [1,0,0,0,0,0,0,0]
- 当 i = 2 时,由于 75 大于 74,因此移除栈顶元素 1,赋值ans[]:= 2 - 1, 将 2 进栈。
- stack = [2(75)]
- ans = [1,1,0,0,0,0,0,0]
- 当 i = 3 时,由于 71 小于 75,因此将 3 进栈。
- stack = [2(75),3(71)]
- ans = [1,1,0,0,0,0,0,0]
- 当 i = 4时,由于 69 小于 71,因此将 4 进栈。
- stack = [2(75),3(71),4(69)]
- ans = [1,1,0,0,0,0,0,0]
- 当 i = 5时,由于 72 大于 69 和 71,因此移除栈顶元素 4 和 3,赋值ans[4]:= 5 - 4, 和 ans[3] := 5 - 3, 将 5 进栈。
- stack = [2(75),5(72)]
- ans = [1,1,0,2,1,0,0,0]
- 当 i = 6 时,由于 76 大于 62 和 75,因此移除栈顶元素 5 和 2,赋值ans[5]:= 6 - 5, 和 ans[2] := 6 - 2, 将 6 进栈。
- stack = [6(76)]
- ans = [1,1,4,2,1,1,0,0]
- 当 i = 7时,由于 73 大于 76,因此将 7 入栈
- stack = [6(76), 7(73)]
- ans = [1,1,4,2,1,1,0,0]
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int n = temperatures.length;
int[] stack = new int[n];
int[] ans = new int[n];
int index = 0;
for(int i = 0; i < n; i++){
while(index != 0 && temperatures[i] > temperatures[stack[index - 1]]){
index--;
ans[stack[index]] = i - stack[index];
}
stack[index++] = i;
}
return ans;
}
}
1. 法二:双指针
解题思路:时间复杂度O(
n
∗
l
o
g
2
n
n * log_2{n}
n∗log2n),空间复杂度O(1) |
---|
- 无需额外空间,且只有在最坏情况下为O(
n
∗
l
o
g
2
n
n * log_2{n}
n∗log2n)时间复杂度,平均时间复杂度接近O(n)
- 从第二个气温开始,每个气温依次往前观察,如果前面某个气温没找到比它高的气温,那么当前气温就是前面这个气温的,第一个比它高的气温。
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
int ans[] = new int[temperatures.length];
for(int i = 1;i<temperatures.length;i++){
int j = i-1;
while(j>=0){
if(ans[j]==0){
if(temperatures[i]>temperatures[j]) {
ans[j] = i-j;
}else break;
}
j--;
}
}
return ans;
}
}