给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit 。
如果不存在满足条件的子数组,则返回 0 。
示例:
输入:nums = [8,2,4,7], limit = 4
输出:2
题解:堆+延迟删除
维护两个指针left、right构成滑动窗口,同时利用两个堆分别维护[left,right]范围内的最大值和最小值。当right向右移动时,会往堆中增加元素,此时的窗口范围内的最大值和最小值很好判断,一定是堆顶元素,但是当窗口范围内任意两个元素之间的绝对差必须大于 limit时,我们需要将left向右移动,来缩小窗口范围,此时我们需要在堆中删除特定元素,此时的堆顶元素可能已经不在窗口范围内,为了解决这个问题我们需要使用延迟删除的方法。
延迟删除是指当我们需要在堆中删除特定元素时,并不真正的去删除堆中元素,而是用哈希表记录下这一特定元素。而当需要在堆中取出堆顶元素时,判断该元素是否在哈希表中有记录,如果有,则弹出堆顶元素,直到堆顶元素不在哈希表中,再取出堆顶元素。
class Solution {
PriorityQueue<Integer>small=new PriorityQueue<>(Integer::compareTo);
PriorityQueue<Integer>big=new PriorityQueue<>(Comparator.reverseOrder());
Map<Integer,Integer>bigMap=new HashMap