简单模拟,统计相同的pair个数,记得要重写hashCode方法,才能对class进行比较
class Solution {
static class Node {
int a,b;
public Node(int a, int b) {
this.a = a;
this.b = b;
}
@Override
public boolean equals(Object obj) {
Node node = (Node)obj;
if(a==node.a && b==node.b)
return true;
return false;
}
@Override
public int hashCode() {
return a*31 + b*361;
}
}
boolean compare(int[] a, int[] b) {
if(a[0]==b[0] && a[1]==b[1])
return true;
if(a[0]==b[1] && a[1]==b[0])
return true;
return false;
}
void swap(int[] a) {
if(a[0] > a[1]) {
int tmp = a[0];
a[0] = a[1];
a[1] = tmp;
}
}
public int numEquivDominoPairs(int[][] dominoes) {
int res = 0;
// Set<Node> set = new HashSet<>();
Map<Node,Integer> map = new HashMap<>();
for(int i=0;i<dominoes.length;i++) {
swap(dominoes[i]);
Node node = new Node(dominoes[i][0], dominoes[i][1]);
if(map.containsKey(node))
map.put(node, map.get(node)+1);
else
map.put(node, 1);
// if(set.contains(node))
// res++;
// set.add(node);
}
for (Map.Entry<Node, Integer> entry : map.entrySet()) {
// entry.getKey();
// entry.getValue();
if(entry.getValue() > 1) {
for(int i=1;i<entry.getValue();i++)
res += i;
}
}
//res = dominoes.length - set.size();
// for(int i=0;i<dominoes.length;i++) {
// for(int j=i+1;j<dominoes.length;j++) {
// if(compare(dominoes[i], dominoes[j]))
// res++;
// }
// }
return res;
}
}
大佬的简单写法
class Solution {
public int numEquivDominoPairs(int[][] dominoes) {
Map<Integer, Integer> map = new HashMap<>();
int count = 0;
for(int[] d : dominoes) {
int key = Math.min(d[0],d[1])*10 + Math.max(d[0],d[1]);
map.put(key, map.getOrDefault(key,0)+1);
}
for(int v : map.values()) count += v*(v-1)/2;
return count;
}
}
学会使用getOrDefault方法,可以使逻辑简洁不少。在统计的时候还进行了简单优化,降低了复杂度