描述
给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
如果不存在满足条件的子数组,则返回 0 。
分析
滑动窗口遍历数组,若满足条件不断拓展right。若不满足条件,平移left,right。
如何判断left,right这段区间内是否任意两个元素之间的绝对差必须小于或者等于 limit?
借助大顶堆和小顶堆,按顺序保存left,right之间的元素,快捷判断left,right这段区间内的极值差。
class Solution {
public int longestSubarray(int[] nums, int limit) {
PriorityQueue<Integer> bigHeap = new PriorityQueue<>((a,b)->(b-a));
PriorityQueue<Integer> littleHeap = new PriorityQueue<>();
int right = 0, left = 0, ans = 0;
while (right < nums.length) {
bigHeap.offer(nums[right]);
littleHeap.offer(nums[right]);
if (bigHeap.peek() - littleHeap.peek() <= limit) {
ans = right - left + 1;
right++;
continue;
}
//没有必要一直缩left,只有出现比当前ans更长的满足条件的子数组才会更新ans。
//如果后面在没有更长的满足条件的子数组,那最终结果就是当前的ans。不缩left不会影响最终结果。
bigHeap.remove(nums[left]);
littleHeap.remove(nums[left]);
left++;
right++;
}
return ans;
}
}