问题:
数组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 };