。
思路:两个区间,两者的最小值中的最大值 <= 两者最大值的最小值时 就存在交集
let arr1 = [1,4]; let arr2 = [2,5]; let arr3 = [5,2]; let arr4 = [4,5]; let arr5 = [9,5]; let arr6 = [1,4]; let arr7 = [5,6]; let arr8 = [5,5]; // 判断两个区间是否相交 function isIntersect(arr1,arr2){ let start = [Math.min(...arr1),Math.min(...arr2)];//区间的两个最小值 let end = [Math.max(...arr1),Math.max(...arr2)];//区间的两个最大值 return Math.max(...start) <= Math.min(...end);//最大值里的最小值 是否 小于等于 最大值的最小值 } // 验证 console.log(isIntersect(arr1,arr2));//true console.log(isIntersect(arr1,arr3));//true console.log(isIntersect(arr1,arr4));//true console.log(isIntersect(arr1,arr5));//false console.log(isIntersect(arr1,arr6));//true console.log(isIntersect(arr1,arr7));//false console.log(isIntersect(arr1,arr8));//false // 补充 console.log(Math.max(1,2,3,3,3));//3 console.log(Math.min(1,1,2,3,3,3));//1
。
另一些有意思的小算法
// 用区间集合筛选出互斥的部分 let allArr = [0,1,2,3,4,5,6,7,8,9]; let a = [[1,3],[6,9]]; a.forEach(item => { allArr = allArr.filter(aitem => aitem >= Math.max(...item) || aitem <= Math.min(...item)); }); console.log(allArr); // 判断两个去交是否有交集 function isIntersect(arr1,arr2){ let start = [Math.min(...arr1),Math.min(...arr2)];//区间的两个最小值 let end = [Math.max(...arr1),Math.max(...arr2)];//区间的两个最大值 return Math.max(...start) <= Math.min(...end);//最大值里的最小值 是否 小于等于 最大值的最小值 } // 向区间集合添加新的区间时,判断区间集合中是否存在与新区间有交集的,如果存在,去除区间集合中有交集的区间,再加入新区间 let arr = [[2,5],[4,5],[6,8]]; let arr2 = [3,5]; for(let i = arr.length -1; i >= 0;i--){ if(isIntersect(arr[i],arr2)){ arr.splice(i,1); } } arr.push(arr2) console.log(arr);
跳题逻辑核心思路:
由这样的一个二维数组[[1,3],[4,6]]得到[0,1,3,4,6,7]的一个数组;
推导过程,前推,后退,形成闭环。
。