1. 程式人生 > 其它 >js 求不相交區間 (無重疊)

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

可以看到已經不重疊了