这是一个挑战性的问题,我一直在解决最佳问题(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)中完美地解决这个问题?
答案 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
)