线段最大重叠数量、矩形最大重叠数量

244 阅读1分钟

题目

给定一组线段,求其中某个线段能够重叠其它线段的最大线段数量

  • 一个线段能够和其它线段重叠,则该线段的头一点在另一个线段的头和尾之间
  • 先将线段按照头大小排序,这样可以使得后序的每一个线段的头都在之前线段的前面,只需要再判断头是否在之前线段的尾里即可,通过一个容器来存储当前线段前面的线段尾大小,如果当前线段的头大于之前线段的尾,则全部删掉,最后遗留的容器大小就是当前线段的重叠答案
  • 后序线段根据前面线段已经删除后的容器继续判断头是否大于,大于则删除,因为线段是按照头大小排序的,前面的头大于,后面的头一定也大于,所以可以根据前面删除后的结果继续计算

e0bc7982c49e12cdcb41807ec04c51ae.png

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;
}

进阶题目

5bd84634e3a1a8fb4f53522494de7266.png

  • 如果存在重叠矩形数最多的矩形区域,那么该区域的底边一定在某一个矩形的底边上
  • 问题就转换成了遍历每个矩形,求与其下底边的水平线相交的所有矩形(下底边大于等于其它矩形的上边,小于等于其它矩形的下底边)的线段中,求线段重叠最大数量+1,遍历结束的最大值就是答案

21bb80459c805fe915d456292f944b04.png