题目描述
题目来源:https://leetcode-cn.com/problems/fair-candy-swap/
爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 块糖的大小,B[j] 是鲍勃拥有的第 j 块糖的大小。
因为他们是朋友,所以他们想交换一个糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)
返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。
如果有多个答案,你可以返回其中任何一个。保证答案存在。
示例 1:
输入:A = [1,1], B = [2,2]
输出:[1,2]
示例 2:
输入:A = [2], B = [1,3]
输出:[2,3]
代码描述
class Solution {
public int[] fairCandySwap(int[] A, int[] B) {
int[] ans = new int[2]; // 保存结果数组
int sumA = 0; // A数组的总和
int sumB = 0; // B数组的总和
for (int i: A) sumA += i;
for (int j: A) sumB += j;
for(int i=0; i<A.length; i++) {
for (int j=0; j<B.length; j++) {
// 两人交换的糖果棒的大小由两人糖果总量差决定
if (A[i]-B[j] == (sumA-sumB)/2) {
ans[0] = A[i];
ans[1] = B[j];
}
}
}
return ans;
}
}
通过 Leedcode 测试用例的情况:
优化
Leedcode 给出的解答:
class Solution {
public int[] fairCandySwap(int[] A, int[] B) {
int sa = 0, sb = 0; // sum of A, B respectively
for (int x: A) sa += x;
for (int x: B) sb += x;
int delta = (sb - sa) / 2;
// If Alice gives x, she expects to receive x + delta
Set<Integer> setB = new HashSet();
for (int x: B) setB.add(x);
for (int x: A)
if (setB.contains(x + delta))
return new int[]{x, x + delta};
throw null;
}
}