最大线段重合问题
题目描述
给定很多线段,每个线段都有两个数组[start, end],表示线段开始位置和结束位置,左右都是闭区间。规定:
1)线段的开始和结束位置一定都是整数值
2)线段重合区域的长度必须>=1
题目要求:返回线段最多重合区域中,包含了几条线段
思路:
- 将数组按线段初始位置递增排序
- 弹出小根堆中小于线段初始位置的值,将线段结束位置放入小根堆,更新线段重合线段数
class Line{
public int start;
public int end;
public Line(int s,int e){
this.start = s;
this.end = e;
}
}
public int maxCover(int[][] arr){
if(arr.length == 0){
return 0;
}
Line[] ls = new Line[arr.length];
for(int i = 0;i< arr.length; i++){
ls[i] = new Line(arr[i][0],arr[i][1]);
}
Arrays.sort(ls,new Comparator(Line l1,Line l2){
return l1.start-l2.end;
});
PriorityQueue<Integer> p = new PriorityQueue();
int max = 0;
for(int i = 0;i<ls.size();i++){
Line line = ls[i];
while(!p.isEmpty() && heap.peek()< line.start){
Line e = p.poll();
}
p.add(line.end);
max = Math.max(max,p.size()
}
return max;
}