每日一题最大线段重合问题

Posted 唐宋xy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题最大线段重合问题相关的知识,希望对你有一定的参考价值。

题目

给定很多线段,每个线段都有两个数[start, end],表示线段开始位置和结束位置,左右都是闭区间,

规定:1. 线段开始和结束的位置一定都是整数值 2. 线段重合区域的长度必须>=1

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

例如:给定线段数组:[ [1, 6], [2, 4], [3, 10], [9,20]]

res = 3

3-4的这段重合区域中,包含了3个线段,分别是:[1, 6]、[2,4]、[3,10]

解析

需要计算最大重合线段,那么首先需要判断哪些线段是重合的,因为给定的是无序数组,那么我们可以使用贪心的策略,按照start对线段排序,这样就得到了一个按照start排序的线段二维数组,然后分别统计当前线段内的重合的线段数量。当下一个线段和当前线段不重合的时候,就表示后面的都不会重合了,那么就需要重新开始统计重合的线段数量

代码实现

public static int maxCover(int[][] matrix) 
    Line[] lines = new Line[matrix.length];
    for (int i = 0; i < matrix.length; i++) 
        lines[i] = new Line(matrix[i][0], matrix[i][1]);
    
    Arrays.sort(lines, Comparator.comparingInt(a -> a.start));
    int ans = 0;
    // 小根堆,并且堆里装的是end
    PriorityQueue<Integer> heap = new PriorityQueue<>();
    for (int i = 0; i < lines.length; i++) 
        while (!heap.isEmpty() && lines[i].start >= heap.peek()) 
            heap.poll();
        
        heap.add(lines[i].end);
        // 当前堆里的都是符合当前线段重合的
        ans = Math.max(ans, heap.size());
    
    return ans;


static class Line  
    public int start;
    public int end;

    public Line(int start, int end) 
        this.start = start;
        this.end = end;
    

以上是关于每日一题最大线段重合问题的主要内容,如果未能解决你的问题,请参考以下文章

每日一题最大线段重合问题

每日一题757. 设置交集大小至少为2

每日一题|20170529 动态问题静态化 线段表示字母化

[算法]求若干个线段的最大重合个数

每日一题_190914

1133 不重叠的线段 (贪心算法,最大区间不重合问题)