暴力法
O ( n 2 ) O(n^2) O(n2)
class Solution {
public int[] dailyTemperatures(int[] T) {
int L = T.length;
int[] res = new int[L];
for(int i=0;i<L;i++){
int tmp = 1;
for(int j=i+1;j<L;j++){
if(T[j]<=T[i]){
tmp++;
}else{
break;
}
}
res[i] = tmp<L-i?tmp:0;
}
return res;
}
}
单调栈
O ( n ) O(n) O(n)
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
Deque<Integer> stack = new LinkedList<>();
for(int i=0; i < T.length; i++){
while(!stack.isEmpty() && T[stack.peek()] < T[i]){
res[stack.peek()] = i-stack.peek();
stack.pop();
}
stack.push(i);
}
return res;
}
}
单调栈(monotone-stack)是指栈内元素(栈底到栈顶)都是(严格)单调递增或者单调递减的。
如果有新的元素入栈,栈调整过程中 会将所有破坏单调性的栈顶元素出栈,并且出栈的元素不会再次入栈 。由于每个元素只有一次入栈和出栈的操作,所以 单调栈的维护时间复杂度是O(n) 。
单调栈性质:
- 单调栈里的元素具有单调性。
- 递增(减)栈中可以找到元素左右两侧比自身小(大)的第一个元素。
我们主要使用第二条性质,该性质主要体现在栈调整过程中,下面以递增栈为例(假设所有元素都是唯一),当新元素入栈。
- 对于出栈元素来说:找到右侧第一个比自身小的元素。
- 对于新元素来说:等待所有破坏递增顺序的元素出栈后,找到左侧第一个比自身小的元素。