已经一个矩阵,求将其转化为黑白矩阵的最少改变数字的次数,
input:
3 3
1 1 1
1 5 1
1 1 1
ans:4,因为
5 1 5
1 5 1
5 1 5
又有input:
3 3
1 1 1
1 1 1
1 1 1
ans:4,因为
1 2 1
2 1 2
1 2 1
我在本机上通过的代码:
import java.util.*;
import java.util.Map.Entry;
public class MainM
{
public static void main(String args[])
{
Scanner cin = new Scanner(System.in);
int R= cin.nextInt();
int C= cin.nextInt();
int d[][] = new int[R][C];
int size = R*C*2/3+1;
Map<Integer,Integer> map1 = new HashMap<Integer,Integer>(size);
Map<Integer,Integer> map2 = new HashMap<Integer,Integer>(size);
for(int r=0;r<R;++r) {
for(int c=0;c<C;++c) {
d[r][c] = cin.nextInt();
if((r+c)%2==0) {
if(!map1.containsKey(d[r][c]))
map1.put(d[r][c], 1);
else
map1.put(d[r][c], map1.get(d[r][c])+1);
}else {
if(!map2.containsKey(d[r][c]))
map2.put(d[r][c], 1);
else
map2.put(d[r][c], map2.get(d[r][c])+1);
}
}
}
int ans = Integer.MAX_VALUE;
Entry<Integer, Integer>[] en1s = getleast2( map1);
Entry<Integer, Integer>[] en2s = getleast2( map2);
if(en1s[0].getKey()!=en2s[0].getKey())
ans =R*C-en1s[0].getValue()-en2s[0].getValue();
else
ans = Math.min(R*C-(en1s[1]!=null?en1s[1].getValue():0)-en2s[0].getValue()
, R*C-en1s[0].getValue()-(en2s[1]!=null?en2s[1].getValue():0));
System.out.println(ans);
}
private static Entry<Integer, Integer>[] getleast2(Map<Integer, Integer> map) {
Entry<Integer, Integer>[] least2 = new Entry[2];
for(Entry<Integer, Integer> en : map.entrySet()) {
if(least2[0]==null)
least2[0]=en;
else if(least2[1]==null) {
least2[1]=en;
if(en.getValue()<least2[0].getValue()) {
least2[1] = least2[0];
least2[0] = en;
}
}else if(en.getValue()<least2[0].getValue()){
least2[1] = least2[0];
least2[0] = en;
}else if(en.getValue()<least2[1].getValue()){
least2[1] = en;
}
}
return least2;
}
}