888. Fair Candy Swap

问题:

数组A,和数组B,求交换两数组任意一个元素,使得两数组和相等。

返回{A交换出的元素,B交换出的元素}

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]

  

解法:

求出A和B的元素和SumA和SumB

他们所要拿出交换的元素之差,即是 各自总和平均数(SumA+SumB)/2的差值diff

那么,对A的各个元素itemA,去+diff,是否存在在B中,如果存在,则交换{itemA, itemA+diff}

这里我们要在B中查找任意元素是否存在,则考虑使用unordered_map,则有:

代码参考:

 1 class Solution {
 2 public:
 3     vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
 4         int sumAll=0;
 5         int sumA=0, sumB=0;
 6         unordered_map<int,int>Bmap;
 7         vector<int> res(2,0);
 8         for(int itemA:A){
 9             sumAll+=itemA;
10             sumA+=itemA;
11         }
12         for(int itemB:B){
13             sumAll+=itemB;
14             sumB+=itemB;
15             Bmap[itemB]++;
16         }
17         int diff=sumAll/2-sumA;
18         for(int itemA:A){
19             auto it=Bmap.find(itemA+diff);
20             if(it!=Bmap.end()){
21                 res={itemA, it->first};
22                 break;
23             }
24         }
25         return res;
26     }
27 };

♻️优化:引入bitset类型变量:代表一个二进制数。

第n位,为0或者1,那么我们可以用它来替换unodered_map,

若存在itemB,那么bitset[itemB]=1,否则为0:具体实现方法:bitset.set(itemB);

查看是否存在这样的itemB,则有方法:bitset.test(itemB); 若存在(itemB位为1)返回true,否则返回false。

代码参考:

 1 class Solution {
 2 public:
 3     vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
 4         int sumA=0, sumB=0;
 5         bitset<100001>Bmap;//100001位二进制数位
 6         for(int itemA:A){
 7             sumA+=itemA;
 8         }
 9         for(int itemB:B){
10             sumB+=itemB;
11             Bmap.set(itemB);
12         }
13         int diff=(sumA+sumB)/2-sumA;
14         for(int itemA:A){
15             int it=itemA+diff;
16             if(it>=1 && it<=100000 && Bmap.test(it)==true){
17                 return {itemA, it};
18             }
19         }
20         return {-1,-1};
21     }
22 };
原文地址:https://www.cnblogs.com/habibah-chang/p/12941640.html