题目地址:
https://leetcode.com/problems/number-of-equivalent-domino-pairs/
给定一个长 n n n数组 A A A,其中每个元素都是长 2 2 2的数组,并且所有数字都是 1 ∼ 9 1\sim 9 1∼9。问有多少个数对 i , j , i ≠ j i,j, i\ne j i,j,i=j使得 A [ i ] [ 0 ] = A [ j ] [ 0 ] ∧ A [ i ] [ 1 ] = A [ j ] [ 1 ] A[i][0]=A[j][0] \land A[i][1]=A[j][1] A[i][0]=A[j][0]∧A[i][1]=A[j][1]或者 A [ i ] [ 0 ] = A [ j ] [ 1 ] ∧ A [ i ] [ 1 ] = A [ j ] [ 0 ] A[i][0]=A[j][1] \land A[i][1]=A[j][0] A[i][0]=A[j][1]∧A[i][1]=A[j][0]。
对于每个 A [ i ] A[i] A[i],将其哈希成 max { A [ i ] [ 0 ] , A [ i ] [ 1 ] } ∗ 10 + min { A [ i ] [ 0 ] , A [ i ] [ 1 ] } \max\{A[i][0],A[i][1]\}*10+\min\{A[i][0],A[i][1]\} max{A[i][0],A[i][1]}∗10+min{A[i][0],A[i][1]},这样可以保证满足条件的两个元素的哈希值一定相等,并且反之也成立。接下来只需要开一个哈希表,在循环的时候记录每个小数组已经出现的次数即可。代码如下:
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int numEquivDominoPairs(int[][] dominoes) {
int res = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int[] p : dominoes) {
int hash = Math.max(p[0], p[1]) * 10 + Math.min(p[0], p[1]);
int cnt = map.getOrDefault(hash, 0);
res += cnt;
map.put(hash, cnt + 1);
}
return res;
}
}
时空复杂度 O ( n ) O(n) O(n)。