爱丽丝和鲍勃有不同大小的糖果棒:A[i]是爱丽丝拥有的第i 根糖果棒的大小,B[j]是鲍勃拥有的第j根糖果棒的大小。
因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)

返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1]Bob 必须交换的糖果棒的大小。

如果有多个答案,你可以返回其中任何一个。保证答案存在。

示例 1

  1. 输入:A = [1,1], B = [2,2]
  2. 输出:[1,2]

示例 2

  1. 输入:A = [1,2], B = [2,3]
  2. 输出:[1,2]

示例 3

  1. 输入:A = [2], B = [1,3]
  2. 输出:[2,3]

示例 4

  1. 输入:A = [1,2,5], B = [2,4]
  2. 输出:[5,4]

提示

  • 1 <= A.length <= 10000
  • 1 <= B.length <= 10000
  • 1 <= A[i] <= 100000
  • 1 <= B[i] <= 100000
  • 保证爱丽丝与鲍勃的糖果总量不同。
  • 答案肯定存在。

题解

题目很简单,如果想不出,可以试着模拟一下,找出规律。别楞想!

记爱丽丝的糖果棒的总大小为🥉888. 公平的糖果棒交换 - 图1,鲍勃的糖果棒的总大小为 🥉888. 公平的糖果棒交换 - 图2。设答案为 🥉888. 公平的糖果棒交换 - 图3,即爱丽丝的大小为 x 的糖果棒与鲍勃的大小为 y 的糖果棒交换,则有如下等式:
🥉888. 公平的糖果棒交换 - 图4
化简,得:
🥉888. 公平的糖果棒交换 - 图5
即对于 BB 中的任意一个数 🥉888. 公平的糖果棒交换 - 图6,只要 A 中存在一个数🥉888. 公平的糖果棒交换 - 图7满足 🥉888. 公平的糖果棒交换 - 图8,那么 🥉888. 公平的糖果棒交换 - 图9即为一组可行解。

为了快速查询 A 中是否存在某个数,我们可以先将 A 中的数字存入哈希表中。然后遍历 B 序列中的数 y’在哈希表中查询是否有对应的 x’。使用哈希表明显比数组快!第一行是哈希表
image.png

JavaScript

未使用哈希表

  1. /**
  2. * @param {number[]} A
  3. * @param {number[]} B
  4. * @return {number[]}
  5. */
  6. var fairCandySwap = function(A, B) {
  7. const sumA = A.reduce((prev,cur)=> prev+cur)
  8. const sumB = B.reduce((prev,cur)=> prev+cur)
  9. const res = Math.round((sumA - sumB)/2)
  10. for (let i of B){
  11. if (A.indexOf(res+i)!== -1){
  12. return [res+i,i]
  13. }
  14. }
  15. };

使用哈希表

  1. /**
  2. * @param {number[]} A
  3. * @param {number[]} B
  4. * @return {number[]}
  5. */
  6. var fairCandySwap = function(A, B) {
  7. const sumA = _.sum(A), sumB = _.sum(B);
  8. const delta = Math.floor((sumA - sumB) / 2);
  9. const rec = new Set(A);
  10. var ans;
  11. for (const y of B) {
  12. const x = y + delta;
  13. if (rec.has(x)) {
  14. ans = [x, y];
  15. break;
  16. }
  17. }
  18. return ans;
  19. };

Python

class Solution:
    def fairCandySwap(self, A: List[int], B: List[int]) -> List[int]:
        sumA, sumB = sum(A), sum(B)
        delta = (sumA - sumB) // 2
        rec = set(A)
        ans = None
        for y in B:
            x = y + delta
            if x in rec:
                ans = [x, y]
                break
        return ans

复杂度分析

  • 时间复杂度:🥉888. 公平的糖果棒交换 - 图11,其中 n 是序列 A 的长度,m 是序列 B 的长度。

  • 空间复杂度:🥉888. 公平的糖果棒交换 - 图12,其中 n 是序列 A 的长度。需要建立一个和序列 A 等大的哈希表。