交换对使总和相等

swap pair to make sum equal

问题:给定两个大小为 N 和 M 的整数数组 A[] 和 B[],任务是检查是否存在一对值(每个数组中的一个值),以便交换pair 将使两个数组的总和相等。

我的做法:

  1. 求两个数组的总和。
  2. 找出总和较大的数组(用A[]表示)。
  3. 排序 A.
  4. 对于 B 中的所有值,在 A 中二分查找 (sum(A)-sum(B)/2 + B[i]),如果找到 return true.
  5. Return 错误。

代码:

int sum(int a[], int n){
    int s=0;
    for(int i=0; i<n; i++){
        s+= a[i];
    }
    return s;
}

int findSwapValues(int A[], int n, int B[], int m)
{
    // Your code goes here
    int a = sum(A, n);
    int b = sum(B,m);
    int t;
    int *temp;
    
    if(a<b){
        temp  = A; 
        A = B;
        B = temp;
        t  = n;
        n = m;
        m = t;
        
        t = a;
        a = b;
        b = t;
    }
    
    sort(A, A+n);
    for(int i=0; i<m; i++){
        if(binary_search(A,A+n,(a-b)/2+B[i])){
            return 1;
        }
    }
    return -1;
}

疑问:我的算法在某些测试用例(不是 TLE)上失败了。由于测试用例非常大,很难推理出算法中的问题。我在网上搜索并了解其他方法。我唯一的好奇是为什么它不正确?

我认为您的代码中的错误是您发现 B[i] + (a-b)/2.

问题在于,如果 (a-b) 是奇数,除以 2 会将其四舍五入为最接近的整数,您最终会找到错误的值。

你可以做的是在交换数组之前检查差异是否为奇数,如果为真,直接 return -1 因为如果差异为奇数,则不这样的一对可以永远存在。

我希望我消除了你的疑虑:)。