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

题目描述

题目链接: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个数组可以进行两两组合,:

C n 2 = n ⋅ ( n − 1 ) 2 C_{n}^{2}=\frac{n\cdot \left( n-1 \right)}{2} Cn2=2n(n1)
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值