如何确保较大范围内的每个数字都在较小范围内?

时间:2020-06-09 16:21:37

标签: javascript

假设我们有3个较小的范围,如下所示:

var a = [ 1 , 5 ],
var b = [ 3 , 9 ],
var c = [ 8 , 20]

我们的射程也更大。

var d = [1 , 20]

第一个数字是范围的下限,第二个数字是范围的上限。

如何确定范围d的每个数字至少都在较小的范围(abc)中?

范围可以相互重叠。 对于上述示例,答案为true

但是如果范围是这样:

var a = [ 1 , 6 ], var b = [ 3 , 8 ], var c = [ 10 , 20]

答案将是false,因为数字9不在a,b或c中。

范围数可以是任何数字,这只是一个例子。

我试图合并较小的范围并删除它们之间的重叠,但是由于它们之间的重叠,它太复杂了。

我也可以检查d中的每个数字是否在较小范围内,但是d可以是[1,1000000]。在这一点上,它对内存不友好。

4 个答案:

答案 0 :(得分:1)

for循环,仅根据范围列表将目标范围的最小向前移动。
将3个断言用于目标排序范围所覆盖的目标范围。注意:断言可能可以简化/优化,因此必须进行少于3个比较。

首先对范围进行排序,
给定:每个[x,y] = ranges [n]和[min,max] = d_range

  • min
  • max max
  • min>最大值:覆盖的所有目标范围(最小值已超过最大值)= true

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