leetcode1438(绝对差不超过限制的最长连续子数组:堆+延迟删除)

本文介绍了如何解决LeetCode第1438题,即找到绝对差不超过限制的最长连续子数组的问题。通过使用堆和延迟删除策略,维护两个指针和两个堆,动态调整窗口大小以满足条件。当窗口内元素差超过限制时,通过哈希表进行延迟删除操作,确保正确找出符合条件的最长子数组。
摘要由CSDN通过智能技术生成

给你一个整数数组 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值