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 }
]
可以看到已经不重叠了

浙公网安备 33010602011771号