1128.等价多米诺骨牌对的数量

Q

给你一个由一些多米诺骨牌组成的列表 dominoes。

如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的。

形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 a==c 且 b==d,或是 a==d 且 b==c。

在 0 <= i < j < dominoes.length 的前提下,找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对 (i, j) 的数量。

 

示例:

输入:dominoes = [[1,2],[2,1],[3,4],[5,6]]
输出:1  

提示:

1 <= dominoes.length <= 40000
1 <= dominoes[i][j] <= 9

A

官解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int numEquivDominoPairs(int[][] dominoes) {
int[] num = new int[100];
int ret = 0;
for (int[] domino : dominoes) {
int val = domino[0] < domino[1] ? domino[0] * 10 + domino[1] : domino[1] * 10 + domino[0];
//计算等价多米诺牌个数中可组合的对数
//对于数量为 n 的骨牌,其对数等于 1 + 2 + 3 + 4 + ... + (n - 1) = n(n-1),因此可以边遍历边累加
//eg: [1,2],[2,1],[1,2]/a,b,c 两两一组,3种组合(ab,ac,bc)
ret += num[val];
// 记录该唯一值出现的次数,即等价多米诺牌的个数
num[val]++;
}
return ret;
}
}
  • 思路
    将多米诺骨牌 dominoes[i] = [a, b] 转换为唯一的int值。
    提示 1 <= dominoes[i][j] <= 9,可由此让每一个二元对都变为指定的格式,设定第一维必须不大于第二维。
    因为等价的二元对元素可以相互翻转,所以当a>b时,10*a+b 即可确定顺序相反的两个二元对([a,b][b,a]])唯一的值。
    又因为 1 <= dominoes[i][j] <= 9,所以存放结果的集合可以直接设定长度为100(最大值90+9,即最多访问到num[99],则数组长度应为100)

  • 时间复杂度:
    O(n),其中 n 是多米诺骨牌的数量。我们至多只需要遍历一次该数组。

  • 空间复杂度
    O(1)