js 求不相交區間 (無重疊)
阿新 • • 發佈:2022-04-14
輸入
[ { "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 } ]
可以看到已經不重疊了