堆相关例子-最大线段重合问题

问题描述

给定很多线段,每个线段都有两个数start, end

表示线段开始位置和结束位置,左右都是闭区间

规定:

1)线段的开始和结束位置一定都是整数值

2)线段重合区域的长度必须>=1

返回线段最多重合区域中,包含了几条线段

例如:3,10,3,4,5,9,7,13,9,10返回3

暴力方式解题

思路

先得到线段最小点和最大点,这是所有线段在x轴上的范围 在该范围上,取小数点如0.5进行查看,即查看每个0.5位置,有没有线段包含该点,记录多少条线段 max 用一个变量cover保存所有点中最多覆盖的线段条数 最后得到的cover就是重合区域最多的线段数目

图例

利用小根堆解题

思路

1.将开始点排序后,遍历该数组

2.将堆中所有 <= 当前线段的开始点的数弹出

3.将该点的结束点加入到堆中

4.记录过程中堆的历史最大长度

5.遍历结束后该长度就是其重合最多线段的个数

图例

待排序数组,且以按开始点排序

3,10,3,4,5,9,7,13,9,10

  1. 遍历到3,10
  1. 遍历到3,4
  1. 遍历到5,9

4.遍历到7,13

5.遍历到9,10

code
java 复制代码
public static int coverMax(int [][] lines){
        if(lines.length < 2)
            return 0;
        Arrays.sort(lines, (a, b) -> (a[0] - b[0]));
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        int max = 0;
        for (int [] line : lines){
            while (!minHeap.isEmpty() && minHeap.peek() <= line[0]){
                minHeap.poll();
            }
            minHeap.add(line[1]);
            max = Math.max(max,minHeap.size());
        }
        return max;
}
相关推荐
Java成神之路-9 小时前
Spring AI 统一结构化返回:ChatModel / ChatClient 两种实现方式
java·springaialibaba
Mr. zhihao9 小时前
深度解析:为什么Java序列化需要搭配ByteArrayOutputStream?IO装饰器模式的精妙设计
java·开发语言·装饰器模式
逆境不可逃9 小时前
【LeetCode 912】排序数组——随机化快速排序详解
数据结构·算法·排序算法
Coder-magician9 小时前
《代码随想录》刷题打卡day31:动态规划-背包问题part02
算法·动态规划
薛定e的猫咪9 小时前
从因果视角解决多智能体协作:细读 SCIC 算法
算法
c238569 小时前
《算法武林谱:四大排序神功与二分寻宝术全解》
数据结构·算法·排序算法
vx-程序开发9 小时前
springboot旅游推介平台---附源码24175
java·spring boot·python·spring cloud·eclipse·django·idea
一米阳光86619 小时前
软考(中级)软件设计师核心笔记(9)算法——时间复杂度与空间复杂度、查找算法、排序算法
笔记·算法·职场发展·软考·软件设计师·中级职称
Mem0rin9 小时前
二分查找:左右边界
数据结构·算法
艾莉丝努力练剑9 小时前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试