问题描述
小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);
}
}