Javascript 如何检查多个范围是否相交?

Javascript 如何检查多个范围是否相交?,javascript,Javascript,如果我有一个像[[s1,t1],[s2,t2],…]这样的范围数组,其中数组的每个元素对于所有I都是从si到ti的范围,并且它们是格式良好的,这是si的另一个答案: 按si对范围进行排序 在排序列表中,计算sib[0])返回1; 如果(a[0][[3,8],[4,9],[5,10]。每个((r,i,arr)=>r[0]r[1]);istrue[[3,5],[6,9]。每((r,i,arr)=>r[0]r[1])))为false。我知道OP希望检查所有范围之间是否存在交集。我相信您的解决方案会计算

如果我有一个像[[s1,t1],[s2,t2],…]这样的范围数组,其中数组的每个元素对于所有I都是从si到ti的范围,并且它们是格式良好的,这是si的另一个答案:

  • 按si对范围进行排序
  • 在排序列表中,计算si
    var范围=[[7,11]、[2,5]、[1,3]、[5,8]、交点=0、i=0;
    范围.排序(函数(a,b){
    返回b[0]对于(i=1;i这是我认为可行的方法。有人知道我是否遗漏了什么吗

    谢谢

    function hasOverlap(ranges) {
        if (ranges.length > 0) {
            ranges = ranges.sort(function(a, b) {
                if (a[0] > b[0]) return 1;
                if (a[0] < b[0]) return -1;
                return 0;
            });
    
            var min_r = ranges[0][0];
            var max_r = ranges[0][1];
            for(var i=1; i<ranges.length; i+=1) {
                if (ranges[i][0] > max_r) {
                    return false;
                }
                min_r = Math.max(min_r, ranges[i][0]);
                max_r = Math.min(max_r, ranges[i][1]);
            }
        }
        return true;
    }
    
    功能重叠(范围){
    如果(ranges.length>0){
    范围=范围。排序(函数(a,b){
    如果(a[0]>b[0])返回1;
    如果(a[0]
    正如我在评论中提到的,一个解决方案是检查每个
    si
    是否小于或等于最小的
    ti

    功能重叠(范围){
    var minT=Math.min.apply(Math,ranges.map(函数(r){returnr[1];}));
    
    返回范围。每个(函数(r){return r[0]如果每个
    si
    小于或等于最小的
    ti
    ,所有范围都相交。如果给定的示例[3,8],[4,9],[5,10],[5,10],存在一个公共相交,因为它是[5,8]。另一个示例[[3,5],[6,9],[code>[[3,8],[4,9],[5,10]。每个((r,i,arr)=>r[0]r[1]);
    is
    true
    [[3,5],[6,9]。每((r,i,arr)=>r[0]r[1])))
    false
    。我知道OP希望检查所有范围之间是否存在交集。我相信您的解决方案会计算任意两个范围之间的交集数量,对吗?OP肯定会澄清他们想要什么…要求是检查在每个位置上是否存在所有范围的公共交集同时。啊。好的。一开始我有点不明白。
    function hasOverlap(ranges) {
        if (ranges.length > 0) {
            ranges = ranges.sort(function(a, b) {
                if (a[0] > b[0]) return 1;
                if (a[0] < b[0]) return -1;
                return 0;
            });
    
            var min_r = ranges[0][0];
            var max_r = ranges[0][1];
            for(var i=1; i<ranges.length; i+=1) {
                if (ranges[i][0] > max_r) {
                    return false;
                }
                min_r = Math.max(min_r, ranges[i][0]);
                max_r = Math.min(max_r, ranges[i][1]);
            }
        }
        return true;
    }