因此我们只需要遍历数组 a,查找哪一个 a[i] 使得 a[i] + diff 存在于数组 b 即可。
Java 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { publicint[] fairCandySwap(int[] a, int[] b) { intaSum=0, bSum = 0; for (int i : a) aSum += i; for (int i : b) bSum += i; inttotal= aSum + bSum, target = total / 2; intdiff= target - aSum; for (int i : a) { if (find(b, i + diff)) returnnewint[]{i, i + diff}; } returnnull; // never } booleanfind(int[] nums, int target) { for (int i : nums) { if (i == target) returntrue; } returnfalse; } }
classSolution { public: vector<int> fairCandySwap(vector<int>& a, vector<int>& b){ int aSum = 0, bSum = 0; for (int i : a) aSum += i; for (int i : b) bSum += i; int total = aSum + bSum, target = total / 2; int diff = target - aSum; vector<int> ans(2); for (int i : a) { if (find(b, i + diff)) { ans[0] = i; ans[1] = i + diff; break; } } return ans; } boolfind(vector<int>& nums, int target){ for (int i : nums) { if (i == target) returntrue; } returnfalse; } };
Python 代码:
1 2 3 4 5 6 7 8 9 10
classSolution: deffairCandySwap(self, a: List[int], b: List[int]) -> List[int]: aSum, bSum = sum(a), sum(b) total = aSum + bSum target = total // 2 diff = target - aSum for i in a: if i + diff in b: return [i, i + diff] returnNone
TypeScript 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
functionfairCandySwap(a: number[], b: number[]): number[] { let aSum = a.reduce((acc, val) => acc + val, 0); let bSum = b.reduce((acc, val) => acc + val, 0); let total = aSum + bSum; let target = Math.floor(total / 2); let diff = target - aSum; letans: number[] = []; for (let i of a) { if (b.includes(i + diff)) { ans = [i, i + diff]; break; } } return ans; };
classSolution { publicint[] fairCandySwap(int[] a, int[] b) { // 先求得 a 的总和 intdiff=0; for (int i : a) diff += i; // 使用 cnt 统计 b 中的数的出现次数,同时计算 a 总和与 b 总和的差值 int[] cnt = newint[100009]; for (int i : b) { diff -= i; cnt[i]++; } // 计算出 a 中具体的替换差值是多少 diff /= -2; int[] ans = newint[2]; for (int i : a) { inttarget= i + diff; // 如果目标替换量在合法范围,并且存在于 b 数组中。说明找到解了 if (target >= 1 && target <= 100000 && cnt[target] > 0) { ans[0] = i; ans[1] = target; break; } } return ans; } }
classSolution { public: vector<int> fairCandySwap(vector<int>& a, vector<int>& b){ // 先求得 a 的总和 int diff = 0; for (int i : a) diff += i; // 使用 cnt 统计 b 中的数的出现次数,同时计算 a 总和与 b 总和的差值 vector<int> cnt(100009, 0); for (int i : b) { diff -= i; cnt[i]++; } // 计算出 a 中具体的替换差值是多少 diff /= -2; vector<int> ans(2); for (int i : a) { int target = i + diff; // 如果目标替换量在合法范围,并且存在于 b 数组中。说明找到解了 if (target >= 1 && target <= 100000 && cnt[target] > 0) { ans[0] = i; ans[1] = target; break; } } return ans; } };
Python 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution: deffairCandySwap(self, a: List[int], b: List[int]) -> List[int]: # 先求得 a 的总和 diff = sum(a) # 使用 cnt 统计 b 中的数的出现次数,同时计算 a 总和与 b 总和的差值 cnt = [0] * 100009 for i in b: diff -= i cnt[i] += 1 # 计算出 a 中具体的替换差值是多少 diff //= -2 for i in a: target = i + diff # 如果目标替换量在合法范围,并且存在于 b 数组中。说明找到解了 if1 <= target <= 100000and cnt[target] > 0: return [i, target]