问题背景
给你一组多米诺骨牌 dominoesdominoesdominoes。
形式上,dominoes[i]=[a,b]dominoes[i] = [a, b]dominoes[i]=[a,b] 与 dominoes[j]=[c,d]dominoes[j] = [c, d]dominoes[j]=[c,d] 等价 当且仅当 ( a=ca = ca=c 且 b=db = db=d ) 或者 ( a=da = da=d 且 b=cb = cb=c ) 。即一张骨牌可以通过旋转 000 度或 180180180 度得到另一张多米诺骨牌。
在 0≤i<j<dominoes.length0 \le i < j < dominoes.length0≤i<j<dominoes.length 的前提下,找出满足 dominoes[i]dominoes[i]dominoes[i] 和 dominoes[j]dominoes[j]dominoes[j] 等价的骨牌对 (i,j)(i, j)(i,j) 的数量。
数据约束
- 1≤dominoes.length≤4×1041 \le dominoes.length \le 4 \times 10 ^ 41≤dominoes.length≤4×104
- dominoes[i].length=2dominoes[i].length = 2dominoes[i].length=2
- 1≤dominoes[i][j]≤91 \le dominoes[i][j] \le 91≤dominoes[i][j]≤9
解题过程
包含相同元素的二元组等价,求等价的二元组数量。
实际上只要用哈希表记录元素相同的二元组数量即可,考虑到数据范围不大,用二维数组就行了。
具体实现
class Solution {
public int numEquivDominoPairs(int[][] dominoes) {
int res = 0;
int[][] cnt = new int[10][10];
for (int[] dominoe : dominoes) {
int min = Math.min(dominoe[0], dominoe[1]);
int max = Math.max(dominoe[0], dominoe[1]);
res += cnt[min][max]++;
}
return res;
}
}