题目描述
题目链接: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
个数组可以进行两两组合,:
Cn2=n?(n?1)2C_{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]*100ans = 0for x in dominoes:x = sorted(x)#print(x[0],x[1])visit[10*x [0]+x[1]] += 1for i in range(100):if visit[i]>1:ans += visit[i] * (visit[i]-1) // 2 # Cn2 = n*(n-1) / 2return ans