解题思路
1.首先用哈希表存储key为id,value为数量累加值
2.如果id的value值比2多,就累加起来到diff中。(因为对应的id已经被匹配过,剩下的为需要修改才能匹配) 如果id的value值等于1,就累加到one中。(因为id是两两相匹配,只有一个的id无法与其他id匹配)
3.最后遍历哈希表,有两种情况
①diff>=one
这个时候直接输出diff,因为diff为必须修改的值,这样才能匹配成功,比如[4,4,2,2]这时至少完成四步修改才能使这四个数匹配。而对于one的值,是在完成diff修改时顺便匹配上的,比如[4,4,2,3]这个时候可以把前面两个4修改成2和3即[2,3,2,3],至少需要diff步就可以完成。
②diff<one
这个时候输出diff+(one-diff)/2,前面说过diff是必须完成的修改数值,此时完成了diff步,但是one比diff多,还有一些单个的值没有匹配比如[3,3,3,4,5,6,7,8]。修改完diff步为[4,5,6,4,5,6,7,8]此时还有两个数没有匹配,只需要修改一个数为另一个数就可以,这就是为什么最后要除2的原因了。
还有人可能会考虑为奇数的情况,因为n规定是偶数,又是两两匹配,最后的diff+one一定为偶数,因为偶数+偶数=偶数。
此时的diff与one会有两种情况,奇数+奇数、偶数+偶数。
①:奇数+奇数
diff>=one,直接输出diff不需要考虑除2的问题
diff<one,one-diff两个奇数相减结果为偶数因此也不考虑除2问题
②:偶数+偶数
diff>=one,直接输出diff不需要考虑除2的问题
diff<one,one-diff两个偶数相减结果为偶数因此也不考虑除2问题
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
int diff=0;
int one=0;
int ans=0;
int array[]=new int[n];
Map<Integer,Integer> hash=new HashMap<>();
for(int i=0;i<n;i++)
{
array[i]=scan.nextInt();
hash.put(array[i],hash.getOrDefault(array[i],0)+1);
}
for(int a:hash.values())
{
if(a-2>0)
{
diff+=a-2;//统计没有成一对的数量(多余的)
}
if(a==1)
{
one++;//统计单个的数量
}
}
if(diff>=one)
{
System.out.print(diff);
}
else{
System.out.print(diff+(one-diff)/2);
}
scan.close();
}
}