zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    《POJ-2369》
    《1402
    《2018 Multi-University Training Contest 8》
    《HDU
    循环串
    模拟赛 数根 题解
    备份
    关于带删除线性基
    论OIer谈恋爱的必要性
    某计数题题解
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/12941640.html
Copyright © 2011-2022 走看看