js判斷兩個區間是否存在交集


思路:兩個區間,兩者的最小值中的最大值 <= 兩者最大值的最小值時 就存在交集

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]的一個數組;
推導過程,前推,后退,形成閉環。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM