Go语言题解LeetCode888公平糖果交换示例详解

一 描述

888. 公平的糖果交换 - 力扣(LeetCode) (leetcode-cn.com)

爱丽丝和鲍勃拥有不同总数量的糖果。给你两个数组 aliceSizesbobSizesaliceSizes[i] 是爱丽丝拥有的第 i 盒糖果中的糖果数量,bobSizes[j] 是鲍勃拥有的第 j 盒糖果中的糖果数量。

两人想要互相交换一盒糖果,这样在交换之后,他们就可以拥有相同总数量的糖果。一个人拥有的糖果总数量是他们每盒糖果数量的总和。

返回一个整数数组 answer,其中 answer[0] 是爱丽丝必须交换的糖果盒中的糖果的数目,answer[1] 是鲍勃必须交换的糖果盒中的糖果的数目。如果存在多个答案,你可以返回其中 任何一个 。题目测试用例保证存在与输入对应的答案。

示例 1:

输入:aliceSizes = [1,1], bobSizes = [2,2]
输出:[1,2]

示例 2:

输入:aliceSizes = [1,2], bobSizes = [2,3]
输出:[1,2]

示例 3:

输入:aliceSizes = [2], bobSizes = [1,3]
输出:[2,3]

示例 4:

输入:aliceSizes = [1,2,5], bobSizes = [2,4]
输出:[5,4]

提示:

1 <= aliceSizes.length, bobSizes.length <= 10^4

1 <= aliceSizes[i], bobSizes[j] <= 10^5

爱丽丝和鲍勃的糖果总数量不同。

题目数据保证对于给定的输入至少存在一个有效答案。

二 分析

计算若A与B相同时,A所需要的糖果大小,遍历B,寻找该糖果

  • 首先计算A与B的糖果总和
  • A与B相等所需要的糖果差值是(sum_B-sum_a)/2
  • 构建哈希表,哈希表为A的每个元素,加上2的差值
  • 遍历B,寻找B中是否有某一糖果与哈希表某一数值相等
  • 输出数值

三 答案

class Solution {
public:
    vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
        int sum_A=0;//1 首先计算A与B的糖果总和
        int sum_B=0;
        for(auto a:A)
        {
            sum_A=sum_A+a;
        }
        for(auto b:B)
        {
            sum_B=sum_B+b;
        }
        unordered_map<int,int> map;//2 A与B相等所需要的糖果差值是(sum_B-sum_a)/2
        for(auto a:A)//3 构建哈希表,哈希表为A的每个元素,加上2的差值
        {
            map[a+(sum_B-sum_A)/2];
        }
        for(auto b:B)//4 遍历B,寻找B中是否有某一糖果与哈希表某一数值相等
        {
            if(map.find(b)!=map.end())
            {
                return{b+(sum_A-sum_B)/2,b};//5 输出数值
            }
        }
        return {};
    }
};

以上就是Go语言题解LeetCode888公平糖果交换示例详解的详细内容,更多关于Go题解公平糖果交换的资料请关注其它相关文章!

原文地址:https://juejin.cn/post/7179950757452447801