[题目]
给定一些区间,请返回这些区间里面最大的重叠数,给定的区间的边界值都是正整数
[举例]
输入int[][]二维数组
[
[1,3],
[2,6],
[3,8],
[8,11]
]
此时返回最大重叠区间数为2
[1,3],[2,6]重叠,数目为2
[2,6],[3,8]重叠,数目为2
返回最大值为2
注意: [1,3]和[3,8]不算重叠!!!
[最优解]
利用小顶堆
思路是
- 先给区间按照左边界从小到大排序,如果左边界相等,谁先谁后都行!!
- 遍历每一个区间,记当前区间的左边界为curLeft,右边界为curRight
把curLeft同小顶堆里的数比较,弹出堆里所有比curLeft小的值,然后把curRight添加到小顶堆里,记录此时小顶堆的大小,记为size,该size为当前区间的重叠数 - 遍历完所有的区间后,取最大size,即为所求的最大重叠数
public class MaxRegion {
public static void main(String[] args) {
int[][] lines = {
{1, 3},
{2, 6},
{3, 8},
{8, 11}
};
System.out.println(MaxRegion.getMaxRegion(lines));
}
public static int getMaxRegion(int[][] lines){
if (lines == null || lines.length == 0) return 0;
//1.按照区间的左边界排序
Arrays.sort(lines,(a,b) -> a[0] - b[0]);
//小顶堆
PriorityQueue<Integer> minRootHeap = new PriorityQueue<>();
//记录最大的重叠区间数
int max = 0;
for (int[] line : lines) {
int curLeft = line[0];
int curRight = line[1];
// 2.堆里 <= curLeft的弹出 , 如果堆大小为0,直接加入
while(!minRootHeap.isEmpty() && minRootHeap.peek() <= curLeft){
minRootHeap.poll();
}
minRootHeap.offer(curRight);
//3.把当前区间的重叠数与最大重叠数max作比较,取最大的
int size = minRootHeap.size();
max = Math.max(max, size);
}
return max;
}
}
[output] 为 2