【发布时间】:2018-08-03 15:22:50
【问题描述】:
给定两个数组arr1 和arr2,我们必须找到最小交换来将两个数组相对排序为严格递增的顺序。如果无法进行相对排序,则返回 -1。
相对排序定义为交换arr1和arr2的相同索引元素。
即相对排序的步骤:
swap(arr1[i], arr2[i])
而严格递增的顺序定义为:
arr[i+1]>arr[i] for all i
例子:
arr1={1,4,4,9}
arr2={2,3,5,10}
那么最小交换为 1,因为交换 arr1[2] 和 arr2[2],将使两个数组都严格增加。
我使用递归解决了这个问题。
如果arr[i]>arr[i+1],我们可以交换索引i的元素或索引i+1的元素,然后调用索引i+1的函数。我试图找到两个值中的最小值并返回它。对i 的每个索引都遵循此过程。
int f(int N, int *arr1, int *arr2, int i){
if(i == N-1)
return 0;
if(arr1[i]>=arr1[i+1] && arr2[i]>=arr2[i+1])return -1;
if(arr1[i]>=arr1[i+1] || arr2[i]>=arr2[i+1]){
int m, n;
swap(arr1[i], arr2[i]);
m = f(N, arr1, arr2, i+1);
swap(arr1[i], arr2[i]);
swap(arr1[i+1, arr2[i+1]);
n = f(N, arr1, arr2, i+1);
if(m == -1 && n==-1)return -1;
if(m==-1)return n;
if(n==-1)return m;
return min(m, n);
}
return f(N, arr1, arr2, i+1);
}
int minSwaps(int N, int *arr1, int *arr2){
return f(N, arr1, arr2, 0);
}
由于这是我在在线编码测试中遇到的问题,我通过了基本的测试用例,但我仍然不确定这种方法是否适用于所有测试用例。
另外,我想知道这个问题是否可以使用动态编程来解决。如果是,表中应该存储什么状态?应该采用什么方法?
【问题讨论】:
-
this link 是否与您在帖子中询问的内容相似?
-
@LAD 不,不是。我正在编辑问题以包含一个示例
-
如果无法进行相对排序,那么我们必须返回 - 1
-
@LAD 是的,OP 需要对此进行更多说明。即使最多有 2 个重复整数,也可能存在不可能的状态。喜欢
[1,5,9]和[2,3,3]。我也觉得让我们假设如果只给出有效的输入,那么这个问题并不像看起来那么棘手。 -
@Nisha 这是有道理的。您可能想在帖子中说明这一点。