- Sliding Window
Use deques or multiset to track min/max in window; shrink if difference exceeds limit.
O(n)
O(n)
import java.util.*;
class Solution {
public int longestSubarray(int[] nums, int limit) {
Deque<Integer> minDeque = new ArrayDeque<>(), maxDeque = new ArrayDeque<>();
int left = 0, ans = 0;
for (int right = 0; right < nums.length; right++) {
while (!minDeque.isEmpty() && minDeque.peekLast() > nums[right]) minDeque.pollLast();
while (!maxDeque.isEmpty() && maxDeque.peekLast() < nums[right]) maxDeque.pollLast();
minDeque.addLast(nums[right]);
maxDeque.addLast(nums[right]);
while (maxDeque.peekFirst() - minDeque.peekFirst() > limit) {
if (nums[left] == minDeque.peekFirst()) minDeque.pollFirst();
if (nums[left] == maxDeque.peekFirst()) maxDeque.pollFirst();
left++;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}