假设我们有3个较小的范围,如下所示:
var a = [ 1 , 5 ],
var b = [ 3 , 9 ],
var c = [ 8 , 20]
我们的射程也更大。
var d = [1 , 20]
第一个数字是范围的下限,第二个数字是范围的上限。
如何确定范围d
的每个数字至少都在较小的范围(a
或b
或c
)中?
范围可以相互重叠。
对于上述示例,答案为true
。
但是如果范围是这样:
var a = [ 1 , 6 ], var b = [ 3 , 8 ], var c = [ 10 , 20]
答案将是false
,因为数字9不在a,b或c中。
范围数可以是任何数字,这只是一个例子。
我试图合并较小的范围并删除它们之间的重叠,但是由于它们之间的重叠,它太复杂了。
我也可以检查d中的每个数字是否在较小范围内,但是d可以是[1,1000000]。在这一点上,它对内存不友好。
答案 0 :(得分:1)
for循环,仅根据范围列表将目标范围的最小向前移动。
将3个断言用于目标排序范围所覆盖的目标范围。注意:断言可能可以简化/优化,因此必须进行少于3个比较。
首先对范围进行排序,
给定:每个[x,y] = ranges [n]和[min,max] = d_range
fn = (abc, [min, max]) => {
abc.sort((x, y) => x[0] - y[0])
for (const [x, y] of abc) {
if (min < x || max < x || min > max) break
min = Math.max(min, y + 1)
}
return min > max
}
var a = [1, 6];
var b = [3, 8];
var c = [10, 20]
var d = [1, 20]
console.log(
fn([a, b, c], d)
)
var a = [1, 6];
var b = [3, 9];
var c = [10, 20]
var d = [1, 20]
console.log(
fn([a, b, c], d)
)
答案 1 :(得分:0)
您可以执行以下操作:
在此处d
制作一个更大范围的布尔数组
var range = []
然后在每个小范围内 例如。 a = [1,6],使range [1..6]为true =>表示存在覆盖索引元素的范围。
最后,如果range数组中没有false
项,那么您会被覆盖。可以按照以下步骤完成:
for(var i=0; i<range.length; i++) {
if(!range[i]) return false;
}
return true;
答案 2 :(得分:0)
您必须决定的一个问题是,如果您具有范围[1,4]和[6,10],那么[1,10]是在范围内还是不在范围内?
如果它在范围内,那么最简单的解决方案是找到每个较小范围的绝对最小值和最大值,然后查看d范围是否适合这些范围。
如果它不被认为是“在范围内”,则可以逐步遍历较小的范围并创建一个数字哈希,并为该范围内的每个数字设置为true:
var a = [ 1 , 5 ]
var numberHash = {}
for(let x= a[0]; x <= a[1] x++)
numberHash[x] = true;
//repeat for each array
var d = [ 1 , 20 ]
var rangeIsGood = true;
for(let x= d[0]; x <= d[1] x++)
if(!numberHash[x])
rangeIsGood = false;
console.log(rangeIsGood);
答案 3 :(得分:0)
您可以合并重叠的部分,获取这些部分的数量,然后返回长度为(1)以及所需上下限的支票。
const
check = ([...values], range) => {
let temp = values
.sort((a, b) => a[0] - b[0] || b[1] - a[1])
.reduce((r, [...a]) => {
let last = r[r.length - 1];
if (!last || last[1] < a[0]) r.push(a);
else if (last[1] < a[1]) last[1] = a[1];
return r;
}, []);
return temp.length === 1 && temp[0][0] === range[0] && temp[0][1] === range[1];
};
console.log(check([[1, 5], [3, 9], [8, 20]], [1, 20])); // true
console.log(check([[1, 6], [3, 8], [10, 20]], [1, 20])); // false