从集合A和B中找到两个元素a和b,使得在交换这些元素时,集合的总和是相等的

时间:2017-05-26 04:53:05

标签: algorithm math

设置A = [2,10,5,9] = sum [A] 26

设置B = [1,10,4,9] = sum [B] 24

从集合A和B中找到两个元素a,b,使其

sum [A] - a + b = sum [B] - b + a

我在O(n ^ 2)中解决了这个问题。

for(int i=0;i<4;i++){
    for(int j=0;j<4;j++){
        if(sumOfA - A[i] + B[j] == sumOfB + A[i] - B[j]){
            System.out.println("solution: " + A[i] + ", " + B[j])
            return;
        }
    }
}

如何将其改进为O(n)?

1 个答案:

答案 0 :(得分:4)

将集合A的元素放入允许在O(1)中测试集合成员资格的结构中(例如,如果元素范围很小,则为哈希表或位向量)。这将在O(n)中运行。

现在遍历集合B并检查A中是否存在远离B中元素的正确距离(总和差异的一半)中的元素。这也将在O(n)中运行。

这是一些伪代码,其中集合A的表示方式是contains操作在O(1)中运行:

sumA = sum(A);
sumB = sum(B);
foreach (b in B) {
    a = b + (sumA - sumB)/2;
    if (A contains a) {
        return pair(a, b);
    }
}
return "no solution";