如何检查是否存在多个范围的交集?

时间:2017-02-09 06:00:49

标签: javascript

如果我有一个范围数组,如[[s1,t1],[s2,t2],...],其中数组的每个元素都是从si到ti的范围,对于所有i,它们形成良好即si< = ti,如何检查所有范围之间是否存在交叉点?

编辑:

要求是检查所有范围是否同时存在重叠。

由于

3 个答案:

答案 0 :(得分:1)

又一个答案:

  1. 按照
  2. 对范围进行排序
  3. 在排序列表中,计算si< t(i-1) - 这是交叉点的数量。
  4. var ranges = [[7, 11], [2, 5], [1, 3], [5, 8]], intersections = 0, i = 0;
    ranges.sort(function(a, b) {
      return b[0] < a[0];
    });
    for(i=1; i<ranges.length; i++) {
      if(ranges[i][0] < ranges[i-1][1]) {
        intersections++;
      }
    }
    console.log('Intersections:', intersections); // Outputs "Intersections: 2"
    

答案 1 :(得分:0)

这是我认为可行的方式。任何人都知道我错过了什么吗?

由于

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;
}

答案 2 :(得分:0)

正如我在评论中提到的,一种解决方案是检查每个si是否小于或等于最小ti

&#13;
&#13;
function overlaps(ranges) {
  var minT = Math.min.apply(Math, ranges.map(function(r) { return r[1]; }));
  return ranges.every(function(r) { return r[0] <= minT; });
}

console.log(overlaps([[3,8], [4,9], [5,10]]));
console.log(overlaps([[3,5], [6,9]]));
console.log(overlaps([[1,5], [3,5], [4,5]]));
&#13;
&#13;
&#13;