春招冲刺Day1[高频算法题] -- 最大重叠区间的个数

[题目]
给定一些区间,请返回这些区间里面最大的重叠数,给定的区间的边界值都是正整数
[举例]
输入int[][]二维数组
[
[1,3],
[2,6],
[3,8],
[8,11]
]
在这里插入图片描述
此时返回最大重叠区间数为2
[1,3],[2,6]重叠,数目为2
[2,6],[3,8]重叠,数目为2
返回最大值为2
注意: [1,3]和[3,8]不算重叠!!!

[最优解]
利用小顶堆
思路是

  1. 先给区间按照左边界从小到大排序,如果左边界相等,谁先谁后都行!!
  2. 遍历每一个区间,记当前区间的左边界为curLeft,右边界为curRight
    把curLeft同小顶堆里的数比较,弹出堆里所有比curLeft小的值,然后把curRight添加到小顶堆里,记录此时小顶堆的大小,记为size,该size为当前区间的重叠数
  3. 遍历完所有的区间后,取最大size,即为所求的最大重叠数
public class MaxRegion {

    public static void main(String[] args) {
        int[][] lines = {
            {1, 3},
            {2, 6},
            {3, 8},
            {8, 11}
        };
        System.out.println(MaxRegion.getMaxRegion(lines));
    }

    public static int getMaxRegion(int[][] lines){
        if (lines == null || lines.length == 0) return 0;

        //1.按照区间的左边界排序
        Arrays.sort(lines,(a,b) -> a[0] - b[0]);
        //小顶堆
        PriorityQueue<Integer> minRootHeap = new PriorityQueue<>();
        //记录最大的重叠区间数
        int max = 0;
        for (int[] line : lines) {
            int curLeft = line[0];
            int curRight = line[1];
            // 2.堆里 <= curLeft的弹出 , 如果堆大小为0,直接加入
            while(!minRootHeap.isEmpty() && minRootHeap.peek() <= curLeft){
                minRootHeap.poll();
            }
            minRootHeap.offer(curRight);
            //3.把当前区间的重叠数与最大重叠数max作比较,取最大的
            int size = minRootHeap.size();
            max = Math.max(max, size);
        }
        return max;
    }
}

[output] 为 2

左神原视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值