小U的文具匹配问题

105 阅读2分钟

问题描述

小M有nn支笔和mm个本子,每支笔的颜色由整数表示,同样本子的颜色也由整数表示。小M希望拿一支笔和一本本子使得它们的颜色相同即可匹配,此外,若颜色为-1,表示这是一支/一本彩色的笔或本子,彩色的笔或本子可以与任何颜色匹配。现在她想知道最多能匹配多少对笔和本子。

例如,如果有 3 支笔,颜色分别为 [1, 2, 3],而有 4 本本子,颜色分别为 [2, 2, 3, -1],则最多可以匹配 3 对。


测试样例

样例1:

输入:n = 3 ,m = 4 ,a = [1, 2, 3] ,b = [2, 2, 3, -1]
输出:3

样例2:

输入:n = 2 ,m = 3 ,a = [5, -1] ,b = [5, 5, 7]
输出:2

样例3:

输入:n = 4 ,m = 4 ,a = [8, 9, 10, 11] ,b = [12, -1, -1, 8]
输出:3

import java.util.*;

public class Main {
    public static int solution(int n, int m, List<Integer> a, List<Integer> b) {
        // PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
        // write code here
        //调整排序,让m永远是元素个数多的哪一个!
        int tmp;
        List<Integer> tmpList;
        if(n>m){
            tmp=n;
            n=m;
            m=tmp;
            tmpList=a;
            a=b;
            b=tmpList;
        }
        Map<Integer,Integer> map=new HashMap<>();
        b.forEach(num->{
            if(map.containsKey(num)){
                map.put(num,map.get(num)+1);
            }else{
                map.put(num,1);
            }
        });
        int ans=0,i,asize=a.size(),AmultiColor=0;
        //那a去和b匹配
        for(i=0;i<a.size();i++){
            tmp=a.get(i);
            if(tmp==-1){
                asize--;
                AmultiColor++;
                continue;
            }
            if(map.containsKey(tmp)){
                asize--;
                ans++;
                map.put(tmp,map.get(tmp)-1);
                if(map.get(tmp)==0){
                    map.remove(tmp);
                }
            }
        }
        //a除了-1和匹配到的数,剩下的那些不是彩色和没匹配的数 = asize
        int bMultiColor=0;
        if(map.containsKey(-1)){
            bMultiColor=map.get(-1);
        }
        int bRemian=b.size()-ans-bMultiColor;//b里面除了彩色和匹配的数量
        ans+=Math.min(AmultiColor,bRemian);//a彩色和b匹配

         if (AmultiColor>bRemian) {
            AmultiColor-=bRemian;
        }else{
             AmultiColor=0;
         }
        ans+=Math.min(bMultiColor,asize);//b的彩色和a匹配
      if(bMultiColor>asize){
           bMultiColor-=asize;
        }else{
          bMultiColor=0;
      }

        ans+=Math.min(bMultiColor,AmultiColor);//a、b的彩色相互匹配!


        System.out.println(ans);
        return ans;
    }

    public static void main(String[] args) {
        System.out.println(solution(3, 4, Arrays.asList(1, 2, 3), Arrays.asList(2, 2, 3, -1)) == 3);
        System.out.println(solution(2, 3, Arrays.asList(5, -1), Arrays.asList(5, 5, 7)) == 2);
        System.out.println(solution(4, 4, Arrays.asList(8, 9, 10, 11), Arrays.asList(12, -1, -1, 8)) == 3);
    }
}