最小数量的"交换"需要排序两个数组

时间:2018-03-19 16:52:11

标签: arrays algorithm sorting language-agnostic tuples

这是一个挑战性的问题,我一直在解决最佳问题(my attempt with failure analysis)。

给定两个长度相等的数组A = [1,8,12,11], B = [7,3,10,15],只需执行交换即可按升序对它们进行排序。

swap表示将i中索引为A的元素替换为相应的B元素,反之亦然。

以上示例可以通过A = [1,3,12,15], B = [7,8,10,11]解析为A = [1,3,10,11], B = [7,8,12,15]2 swaps。但是,在某些情况下,解决方案具有不同的交换次数,此处选择最小值,如果不可行,则返回-1

我如何在O(N)中完美地解决这个问题?

1 个答案:

答案 0 :(得分:6)

f(i, swap)表示在索引i之前可实现的最小交换数,其中swap是一个布尔值,表示是否要交换索引i处的元素。然后:

f(i, false) = min(
  f(i - 1, false) if A[i] >= A[i-1] and B[i] >= B[i-1] else Infinity,

  f(i - 1, true) if A[i] >= B[i-1] and B[i] >= A[i-1] else Infinity
)

f(i, true) = min(
  1 + f(i - 1, false) if B[i] >= A[i-1] and A[i] >= B[i-1] else Infinity,

  1 + f(i - 1, true) if B[i] >= B[i-1] and A[i] >= A[i-1] else Infinity
)