Alice and Bob have candy bars of different sizes: A[i]
is the size of the i
-th bar of candy that Alice has, and B[j]
is the size of the j
-th bar of candy that Bob has.html
Since they are friends, they would like to exchange one candy bar each so that after the exchange, they both have the same total amount of candy. (The total amount of candy a person has is the sum of the sizes of candy bars they have.)git
Return an integer array ans
where ans[0]
is the size of the candy bar that Alice must exchange, and ans[1]
is the size of the candy bar that Bob must exchange.github
If there are multiple answers, you may return any one of them. It is guaranteed an answer exists.数组
Example 1:code
Input: A = [1,1], B = [2,2] Output: [1,2]
Example 2:htm
Input: A = [1,2], B = [2,3] Output: [1,2]
Example 3:blog
Input: A = [2], B = [1,3] Output: [2,3]
Example 4:ip
Input: A = [1,2,5], B = [2,4] Output: [5,4]
Note:leetcode
1 <= A.length <= 10000
1 <= B.length <= 10000
1 <= A[i] <= 100000
1 <= B[i] <= 100000
这道题说爱丽丝和鲍勃两人有不一样大小的糖果,如今要让两人交换一个糖果,使得交换后两人的糖果总重量相同,并且限定了两人初始时的糖果总量不相同,而且必定会有解。若咱们仔细观察题目中给的例子,能够发现全部例子中起始时 Alice 和 Bob 两人的糖果总重量的差值必定时偶数,这是 make sense 的,由于最终两人的糖果总量时要相同的,那么起始时的重量差就应该能平均分为两部分,一部分来弥补轻的一方,一部分来抵消重的一方。那么有了这个 diff,咱们只须要在两个数组中查找差值为 diff 的两个数字了,其实就是 Two Sum 的变种,使用一个 HashSet 先来保存数组 A 中全部的数字,而后遍历数组B中的每一个数字 num,查找 HashSet 中否存在 num+diff 便可,参见代码以下:get
class Solution { public: vector<int> fairCandySwap(vector<int>& A, vector<int>& B) { int diff = (accumulate(A.begin(), A.end(), 0) - accumulate(B.begin(), B.end(), 0)) / 2; unordered_set<int> st(A.begin(), A.end()); for (int num : B) { if (st.count(num + diff)) return {num + diff, num}; } return {}; } };
Github 同步地址:
https://github.com/grandyang/leetcode/issues/888
相似题目:
参考资料:
https://leetcode.com/problems/fair-candy-swap/
https://leetcode.com/problems/fair-candy-swap/discuss/161269/C%2B%2BJavaPython-Straight-Forward