题目:
给定很多线段,每个线段都有两个数组[start,end]表示线段开始位置和结束位置,
左右都是闭区间规定:
1)线段的开始和结束位置一定都是整数值
2)线段重合区域的长度必须>=1返回线段最多重合区域中,包含了几条线段
代码:
public static int coverLineMax(int[][] arr) {
//将线段按开始位置进行排序
Arrays.sort(arr, (a, b) -> Integer.compare(a[0], b[0]));
//小根堆结构队列:存放遍历过线段的结束位置。
PriorityQueue<Integer> queue = new PriorityQueue();
//记录最大重合量
int max = 0;
for (int i = 0; i < arr.length; i++) {
/**
* 大家可以画两条重合的线段。
* 两个线段进行重合时,那么一定有一条线段的开始位置,是作为【重合位置】的开始位置。
* 所以说只要穿过这个开始位置那么就说明这两个线段重合。
* 那我们只需要找到以有多少线段的结束位置 大于 当前线段的开始位置就好。这个数与当前线段的重合的数量。
*/
//queue队列:存放遍历过线段的结束位置,由于它是个小根堆队列,那么头节点,表示最靠前的结束位置。
//如果arr[i][0]当前线段的开始位置,如果队列中最小的结束位置小于等于当前线段的开始位置,那么代表两个线段没有重合,将这个结束位置弹出。
while (!queue.isEmpty() && queue.peek() <= arr[i][0]) {
queue.poll();
}
//将当前线段加入
queue.add(arr[i][1]);
//加入当前线段后,计算重叠的线段数。
max = Math.max(max, queue.size());
}
return max;
}