。
思路:兩個區間,兩者的最小值中的最大值 <= 兩者最大值的最小值時 就存在交集
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]的一個數組;
推導過程,前推,后退,形成閉環。
。