js 求不相交区间 (无重叠)

输入

[
    { "left": 0, "right": 3 },
    { "left": 0, "right": 6 },
    { "left": 6, "right": 9 },
    { "left": 6, "right": 12 },
    { "left": 0, "right": 14 },
    { "left": 12, "right": 14 },
    { "left": 14, "right": 15 },
    { "left": 15, "right": 16 },
    { "left": 16, "right": 18 },
    { "left": 18, "right": 20 },
    { "left": 20, "right": 21 },
    { "left": 20, "right": 22 },
    { "left": 22, "right": 23 },
    { "left": 23, "right": 24 },
    { "left": 24, "right": 26 },
    { "left": 26, "right": 30 },
    { "left": 14, "right": 34 },
    { "left": 30, "right": 34 },
    { "left": 34, "right": 36 },
    { "left": 36, "right": 38 },
    { "left": 38, "right": 40 },
    { "left": 34, "right": 42 },
    { "left": 40, "right": 42 },
    { "left": 42, "right": 50 },
    { "left": 51, "right": 52 },
    { "left": 53, "right": 61 },
    { "left": 63, "right": 91 },
    { "left": 165, "right": 215 },
    { "left": 0, "right": 217 },
    { "left": 42, "right": 217 }
]

可以看到这些区间是 有重叠的 ,我想要的效果是 去掉 大区间 ,保留小区间 并且 互相 不重叠

首先 需要对 他排序 ,然后 记录 上一个 right 值 lastRight ,

接着遍历 ,如果 遍历的 item 大于等于 lastRight ,就说明不重叠 ,把他加到结果数组里面

代码如下 l 即为input

    let l: Section[] = 原始数组;
    
    console.log("l", l)
    l.sort((a, b) => {
      return a.right - b.right
    })
    let lastRight = l[0].right;
    arr.push(l[0]);
    l.forEach(item => {
      if (item.left >= lastRight) {
        arr.push(item)
        lastRight = item.right;
      }
    })
    console.log(arr)

结果如下

[
    { "left": 0, "right": 3 },
    { "left": 6, "right": 9 },
    { "left": 12, "right": 14 },
    { "left": 14, "right": 15 },
    { "left": 15, "right": 16 },
    { "left": 16, "right": 18 },
    { "left": 18, "right": 20 },
    { "left": 20, "right": 21 },
    { "left": 22, "right": 23 },
    { "left": 23, "right": 24 },
    { "left": 24, "right": 26 },
    { "left": 26, "right": 30 },
    { "left": 30, "right": 34 },
    { "left": 34, "right": 36 },
    { "left": 36, "right": 38 },
    { "left": 38, "right": 40 },
    { "left": 40, "right": 42 },
    { "left": 42, "right": 50 },
    { "left": 51, "right": 52 },
    { "left": 53, "right": 61 },
    { "left": 63, "right": 91 },
    { "left": 165, "right": 215 }
]

可以看到已经不重叠了

posted @ 2022-04-14 17:58  ifnk  阅读(251)  评论(0)    收藏  举报