题目描述
题目链接:https://leetcode-cn.com/problems/number-of-equivalent-domino-pairs/
解题思路
根据1 <= dominoes[i][j] <= 9
,每一对符合条件的数组,例如[1,2]
和[2,1]
,他们进行排序sorted
之后,我们可以发现他们可以组成一个两位数12
,而其他数组是不可能组成12
的,也就是说任意一对符合条件的数组所组成的两位数是独一无二的。既然如此就可以开一个大小为100
的数组visit,用来记录该两位数被组合的次数,既能够组合成该两位数的数组的个数(注意,不是数组的对数,因为数组[1,2]
或者[2,1]
都能组合成12
,那么visit[12]
等于2
,但是对数却为1
)。
那么怎么求对数呢?
例如样例为[[1,2],[1,2],[2,1],[3,4]]
那么,visit[12]=3
,visit[34]=1
, 因此总共3
个数组,进行sorted
之后组成的两位数为12
,总共有1
个数组进行sorted
之后组成的两位数为34
。既然是对数,那么肯定要求visit[i]>1(出现了两个及以上的数组能够组合成i
),之后用排列组合的方法,假设visit[i]=n(n>1)
,说明有n
个数组可以进行两两组合,:
C
n
2
=
n
⋅
(
n
−
1
)
2
C_{n}^{2}=\frac{n\cdot \left( n-1 \right)}{2}
Cn2=2n⋅(n−1)
即visit[i] * (visit[i]-1) //2
(一定要记得加小括号,先减后乘法)
AC代码如下:
class Solution:
def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:
visit = [0]*100
ans = 0
for x in dominoes:
x = sorted(x)
#print(x[0],x[1])
visit[10*x [0]+x[1]] += 1
for i in range(100):
if visit[i]>1:
ans += visit[i] * (visit[i]-1) // 2 # Cn2 = n*(n-1) / 2
return ans