📅  最后修改于: 2023-12-03 15:10:53.251000             🧑  作者: Mango
当我们需要对两个数组排序时,我们可能会考虑交换它们中的一些元素以满足条件。但是,我们需要首先检查是否可以通过这种方式进行排序。
我们需要首先找到两个数组中未排序的区间。这可以通过遍历数组并比较元素来完成。
int n = A.size();
int startA = -1, endA = -1, startB = -1, endB = -1;
for(int i=0; i<n; i++){
if(A[i] > A[i+1]){
startA = i;
break;
}
}
for(int i=n-1; i>=0; i--){
if(A[i] > A[i+1]){
endA = i+1;
break;
}
}
for(int i=0; i<n; i++){
if(B[i] > B[i+1]){
startB = i;
break;
}
}
for(int i=n-1; i>=0; i--){
if(B[i] > B[i+1]){
endB = i+1;
break;
}
}
如果两个数组的未排序区间相同,则它们可以通过交换相应的元素进行排序。否则,它们无法通过交换元素进行排序。
bool res = true;
if(startA != -1 && startB != -1){
vector<int> Ablock(A.begin()+startA, A.begin()+endA);
vector<int> Bblock(B.begin()+startB, B.begin()+endB);
sort(Ablock.begin(), Ablock.end());
sort(Bblock.begin(), Bblock.end());
bool equal = Ablock == Bblock;
if(!equal) res = false;
}else{
res = false;
}
最后,我们将结果返回给调用函数。
return res;
完整代码如下:
bool canBeSortedBySwapping(vector<int>& A, vector<int>& B) {
int n = A.size();
int startA = -1, endA = -1, startB = -1, endB = -1;
for(int i=0; i<n; i++){
if(A[i] > A[i+1]){
startA = i;
break;
}
}
for(int i=n-1; i>=0; i--){
if(A[i] > A[i+1]){
endA = i+1;
break;
}
}
for(int i=0; i<n; i++){
if(B[i] > B[i+1]){
startB = i;
break;
}
}
for(int i=n-1; i>=0; i--){
if(B[i] > B[i+1]){
endB = i+1;
break;
}
}
bool res = true;
if(startA != -1 && startB != -1){
vector<int> Ablock(A.begin()+startA, A.begin()+endA);
vector<int> Bblock(B.begin()+startB, B.begin()+endB);
sort(Ablock.begin(), Ablock.end());
sort(Bblock.begin(), Bblock.end());
bool equal = Ablock == Bblock;
if(!equal) res = false;
}else{
res = false;
}
return res;
}