如何通过选择最佳互补序列来填充整数序列中的空白

时间:2013-06-12 21:08:38

标签: algorithm integer sequence

说我有这个整数列表:

清单A = 3 5 9 10 11 15

说我还有其他几个整数列表:

清单B1 = 1 2 3 4 5 6 7 8 20 25

清单B2 = 4 7 8 13 17

清单B3 = 10 11 12 13 14 15 16 17

注意:

  • 在A中,4是间隙(同义词为6,7,8,12,13,14)
  • B1,1,2,20和25中的
  • 是脂肪:多余,因为A中的最小值或A中的最大值

是否有任何算法:

  1. 告诉B列表是否填写A列表中的所有空白 - 或不;
  2. (如果未填充某些空白)告诉哪个B列表填补A列表中的空白最佳 =填充的最大空位数和最低脂肪数
  3. 我想这是一个经典的需求...

    ps:我更喜欢.py代码,但伪代码没问题

    非常感谢

2 个答案:

答案 0 :(得分:0)

以下步骤将会这样做

1) Store the gaps of A, in an array.
2) Then Map each element of A With different B(B1,B2,..)
3) And then display the result, based on the result in the above step

这是一种解决这个问题的蛮力方法。

答案 1 :(得分:0)

我会在A和B的排序数组上使用两个迭代器。第一个遍历A,第二个遍历B.每当A中存在间隙时,B中的下一个数字必须填充它。像这样(C#中的例子):

var iterA = A.Sort().GetEnumerator();
var iterB = B.Sort().GetEnumerator();

iterA.MoveNext(); iterB.MoveNext();
var prevA = iterA.Current;
var curB = iterB.Current;

if (curB < prevA) return "B is fat";

while (iterA.MoveNext()) {
  var curA = iterA.Current;
  if (curA - prevA == 1) {
    prevA = curA;
    continue; // no gap
  }
  while (curA - prevA > 1) {
    if (curB != prevA + 1) return "B does not fill gap";
    if (iterB.MoveNext()) {
      curB = iterB.Current;
      prevA++;
    } else return "B does not fill gap";
  }
  prevA = curA;
}

运行时复杂度为线性O(N),N为min(A)和max(A)之间的数字。这只是一个示例,可以让您了解如何解决此问题。我不保证这个算法的正确性,我没有编译或测试它。我不知道python,但我认为它确实提供了类似于C#的迭代器。