Javascript 如何检查多个范围是否相交?
如果我有一个像[[s1,t1],[s2,t2],…]这样的范围数组,其中数组的每个元素对于所有I都是从si到ti的范围,并且它们是格式良好的,这是si的另一个答案: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希望检查所有范围之间是否存在交集。我相信您的解决方案会计算
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]);
istrue
[[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;
}