[LeetCode] 888. Fair Candy Swap 公平糖果交換



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.

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.)

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.

If there are multiple answers, you may return any one of them.  It is guaranteed an answer exists.

Example 1:

Input: A = [1,1], B = [2,2]
Output: [1,2]

Example 2:

Input: A = [1,2], B = [2,3]
Output: [1,2]

Example 3:

Input: A = [2], B = [1,3]
Output: [2,3]

Example 4:

Input: A = [1,2,5], B = [2,4]
Output: [5,4]

Note:

  • 1 <= A.length <= 10000
  • 1 <= B.length <= 10000
  • 1 <= A[i] <= 100000
  • 1 <= B[i] <= 100000
  • It is guaranteed that Alice and Bob have different total amounts of candy.
  • It is guaranteed there exists an answer.

這道題說愛麗絲和鮑勃兩人有不同大小的糖果,現在要讓兩人交換一個糖果,使得交換后兩人的糖果總重量相同,而且限定了兩人初始時的糖果總量不相同,並且一定會有解。若我們仔細觀察題目中給的例子,可以發現所有例子中起始時 Alice 和 Bob 兩人的糖果總重量的差值一定時偶數,這是 make sense 的,因為最終兩人的糖果總量時要相同的,那么起始時的重量差就應該能平均分為兩部分,一部分來彌補輕的一方,一部分來抵消重的一方。那么有了這個 diff,我們只需要在兩個數組中查找差值為 diff 的兩個數字了,其實就是 [Two Sum](http://www.cnblogs.com/grandyang/p/4130379.html) 的變種,使用一個 HashSet 先來保存數組 A 中所有的數字,然后遍歷數組B中的每個數字 num,查找 HashSet 中否存在 num+diff 即可,參見代碼如下:
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


類似題目:

Two Sum


參考資料:

https://leetcode.com/problems/fair-candy-swap/

https://leetcode.com/problems/fair-candy-swap/discuss/161269/C%2B%2BJavaPython-Straight-Forward


[LeetCode All in One 題目講解匯總(持續更新中...)](https://www.cnblogs.com/grandyang/p/4606334.html)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM