class Solution {
public int longestSubarray(int[] nums, int limit) {
// mono increase deque
Deque<Integer> iq = new ArrayDeque<>();
// mono decrease deque
Deque<Integer> dq = new ArrayDeque<>();
int i = 0;
int maxLen = 0;
for (int j = 0; j < nums.length; j++) {
while (!iq.isEmpty() && nums[iq.peekLast()] > nums[j]) {
iq.pollLast();
}
iq.offer(j);
while (!dq.isEmpty() && nums[dq.peekLast()] < nums[j]) {
dq.pollLast();
}
dq.offer(j);
int maxVal = nums[dq.peek()];
int minVal = nums[iq.peek()];
while (maxVal - minVal > limit) {
i++;
if (dq.peek() < i) {
dq.poll();
}
if (iq.peek() < i) {
iq.poll();
}
maxVal = nums[dq.peek()];
minVal = nums[iq.peek()];
}
maxLen = Math.max(maxLen, j-i+1);
}
return maxLen;
}
}