题目
给定一组线段,求其中某个线段能够重叠其它线段的最大线段数量
- 一个线段能够和其它线段重叠,则该线段的头一点在另一个线段的头和尾之间
- 先将线段按照头大小排序,这样可以使得后序的每一个线段的头都在之前线段的前面,只需要再判断头是否在之前线段的尾里即可,通过一个容器来存储当前线段前面的线段尾大小,如果当前线段的头大于之前线段的尾,则全部删掉,最后遗留的容器大小就是当前线段的重叠答案
- 后序线段根据前面线段已经删除后的容器继续判断头是否大于,大于则删除,因为线段是按照头大小排序的,前面的头大于,后面的头一定也大于,所以可以根据前面删除后的结果继续计算
function process(arr) {
arr.sort((a, b) => a[0] - b[0]);
const orderMap = [];
let max = -Infinity;
orderMap.push(arr[0][1]);
for (let i = 0; i < arr.length; i++) {
orderMap = orderMap.filter((item) => item >= arr[i][0]);
max = Math.max(max, orderMap.length);
orderMap.push(arr[i][0])
}
return max;
}
进阶题目
- 如果存在重叠矩形数最多的矩形区域,那么该区域的底边一定在某一个矩形的底边上
- 问题就转换成了遍历每个矩形,求与其下底边的水平线相交的所有矩形(下底边大于等于其它矩形的上边,小于等于其它矩形的下底边)的线段中,求线段重叠最大数量+1,遍历结束的最大值就是答案