1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit (M)
Given an array of integers nums and an integer limit, return the size of the longest non-empty subarray such that the absolute difference between any two elements of this subarray is less than or equal to limit.
Example 1:
Input: nums = [8,2,4,7], limit = 4
Output: 2
Explanation: All subarrays are:
[8] with maximum absolute diff |8-8| = 0 <= 4.
[8,2] with maximum absolute diff |8-2| = 6 > 4.
[8,2,4] with maximum absolute diff |8-2| = 6 > 4.
[8,2,4,7] with maximum absolute diff |8-2| = 6 > 4.
[2] with maximum absolute diff |2-2| = 0 <= 4.
[2,4] with maximum absolute diff |2-4| = 2 <= 4.
[2,4,7] with maximum absolute diff |2-7| = 5 > 4.
[4] with maximum absolute diff |4-4| = 0 <= 4.
[4,7] with maximum absolute diff |4-7| = 3 <= 4.
[7] with maximum absolute diff |7-7| = 0 <= 4.
Therefore, the size of the longest subarray is 2.
Example 2:
Input: nums = [10,1,2,4,7,2], limit = 5
Output: 4
Explanation: The subarray [2,4,7,2] is the longest since the maximum absolute diff is |2-7| = 5 <= 5.
class Solution {
public int longestSubarray(int[] nums, int limit) {
PriorityQueue<Integer> increasing = new PriorityQueue<Integer>();
//PriorityQueue<Integer> decreasing = new PriorityQueue<Integer>(( a, b) -> {return b-a;});
PriorityQueue<Integer> decreasing = new PriorityQueue<Integer>(Comparator.reverseOrder());
int maxLen = 0;
int start = 0;
int end = 0;
while(start<=end && end < nums.length)
{
increasing.offer(nums[end]);
decreasing.offer(nums[end]);
int min = increasing.peek();
int max = decreasing.peek();
if(max-min <= limit)
{
maxLen = Math.max(maxLen, end-start+1);
end++;
}
else
{
increasing.remove(nums[start]);
decreasing.remove(nums[start]);
start++;
end++;
}
}
return maxLen;
}
}