题目地址:
https://leetcode.com/problems/daily-temperatures/
题目大意是,对于数组中每个数字,找出右边第一个比它大的数字,记录下标的差最后返回。典型单调栈的应用。维护一个单调下降的栈,如果栈空或者栈顶大于等于要push进的数,就将该数push进去,否则该数就是栈顶右边第一个大于栈顶的数,就对其进行记录下标的差值并pop掉,直到栈为空或者栈顶重新大于等于要push的数的时候,就push进这个数。总而言之,是要维护栈的单调性。
class Solution {
public int[] dailyTemperatures(int[] T) {
int[] res = new int[T.length];
Deque<Integer> stack = new ArrayDeque<>();
for (int i = 0; i < T.length; i++) {
while (!stack.isEmpty() && T[stack.peek()] < T[i]) {
int cur = stack.pop();
res[cur] = i - cur;
}
stack.push(i);
}
return res;
}
}
时空复杂度 O ( n ) O(n) O(n)。算法正确性证明非常简单,只需证明任意满足条件的pair的下标差都被记录了就行了,而这一点是显然的。