当前位置: 代码迷 >> 综合 >> LeetCode刷题日记-数组-1128. 等价多米诺骨牌对的数量
  详细解决方案

LeetCode刷题日记-数组-1128. 等价多米诺骨牌对的数量

热度:14   发布时间:2024-02-21 12:44:25.0

题目描述

题目链接: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]=3visit[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