每日一题最大线段重合问题
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;
以上是关于每日一题最大线段重合问题的主要内容,如果未能解决你的问题,请参考以下文章