给定两个数组 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);
}
作为在线编码测试中我遇到的问题,我已经通过了基本的测试用例,但是我仍然不确定这种方法是否适用于所有的测试用例。
此外,我想知道是否可以使用动态规划来解决这个问题。如果是,请问应该在表格中存储哪种状态?应该采取什么方法?
[1,5,9]
和[2,3,3]
。我认为,假设只给出有效的输入,那么这个问题并不像看起来那么棘手。 - nice_dev