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]的一个数组;
推导过程,前推,后退,形成闭环。

原文地址:https://www.cnblogs.com/fqh123/p/14342612.html