如果我有一个范围数组,如[[s1,t1],[s2,t2],...],其中数组的每个元素都是从si到ti的范围,对于所有i,它们形成良好即si< = ti,如何检查所有范围之间是否存在交叉点?
编辑:
要求是检查所有范围是否同时存在重叠。
由于
答案 0 :(得分:1)
又一个答案:
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
。
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;