思想:注意两数组长度不一定相同。现只能想到穷举法(时间复杂度大约为O(n^3)):记当前两数组之和的差值为abs(diff),其中diff=sum_A-sum_B,遍历所有组合(a[i], b[j]),察看abs(diff-2*(a[i]-b[j]))与abs(diff)的大小,若前者更小,则更新diff -= 2*(a[i]-b[j])并swap(a[i], b[j]);若找不到这样的组合,则当前状况为所求的最优解
代码:
int process(int a[], int b[], int n, int m){
assert(a != NULL);
assert(b != NULL);
assert(n > 0);
assert(m > 0);
int diff = 0;
for(int i = 0; i < n; i++) diff += a[i];
for(int i = 0; i < m; i++) diff -= b[i]; //初始化diff
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(abs(diff-2*(a[i]-b[j])) < abs(diff)){
diff = diff-2*(a[i]-b[j]); //注意先更新diff再交换a[i]和b[j]
swap(&a[i], &b[j]);
i = 0, j = 0; //若diff被更新则从头开始遍历
}
}
}
return diff;
}