这题目和滑动窗口最大值基本就是一个意思,使用滑动窗口+单调队列。
步骤
- 维护一个max queue
- 维护一个min queue
- 右指针一直移动,如果max - min > limit,移动左指针,直到break > limit。
class Solution {
public int longestSubarray(int[] nums, int limit) {
// 维护一个max queue
// 维护一个min queue
// 右指针一直移动,如果max - min > limit,移动左指针,直到break > limit
int l = 0;
int r = 0;
// queue只保存下标
LinkedList<Integer> maxq = new LinkedList<>();
LinkedList<Integer> minq = new LinkedList<>();
int res = 0;
while (r < nums.length) {
while (!maxq.isEmpty() && nums[maxq.peekLast()] < nums[r]) {
maxq.pollLast();
}
maxq.addLast(r);
while (!minq.isEmpty() && nums[minq.peekLast()] > nums[r]) {
minq.pollLast();
}
minq.addLast(r);
// 一定要检查是否为空,并且不能直接peek后相减,而是nums[max] - nums[min]
while (!maxq.isEmpty() && !minq.isEmpty() && nums[maxq.peekFirst()] - nums[minq.peekFirst()] > limit) {
if (maxq.peekFirst() == l) {
maxq.pollFirst();
}
if (minq.peekFirst() == l) {
minq.pollFirst();
}
l++;
}
res = Math.max(res, r - l + 1);
r++;
}
return res;
}
}