LeetCode1128:等价多米诺骨牌对的数量

目录

一、题目

二、示例

三、思路

四、代码


一、题目

给你一个由一些多米诺骨牌组成的列表 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

三、思路

首先,先对列表进行排序。先将列表中的元素按照大小进行排序,之后再整体排序。

例如,将列表 dominoes = [[2, 1], [1, 2], [1, 2], [1, 2], [2, 1], [1, 1], [1, 2], [2, 2]] 进行排序得到,

dominoes = [[1, 1], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [1, 2], [2, 2]

再append[0, 0],便无需考虑边界条件了。

tmp 变量计算相同骨牌的数量,利用 reduce函数计算 1 到 n 的和。例如,当列表中有3组骨牌相同,那么他们可以组成 2 + 1 对。

最后,返回总数即可。

四、代码

from functools import reduce
class Solution:
    def numEquivDominoPairs(self, dominoes) -> int:
        """
        :param dominoes: List[List[int]]
        :return: int
        """
        counts = 0

        # 排序
        for i in dominoes:
            i.sort()
        dominoes.sort()
        dominoes.append([0, 0])
        # print(dominoes)

        tmp = 1
        for j in range(len(dominoes) - 1):
            if dominoes[j] == dominoes[j + 1]:
                tmp += 1
            else:
                counts += reduce(lambda x, y: x + y, range(1, tmp)) if tmp >= 2 else 0
                tmp = 1
        return counts

if __name__ == '__main__':
    # dominoes = [[1, 2], [2, 1], [3, 4], [5, 6]]
    # dominoes = [[1, 2], [1, 2], [1, 1], [1, 2], [2, 2]]
    # dominoes = [[2, 2], [1, 2], [1, 2], [1, 1], [1, 2], [1, 1], [2, 2]]
    dominoes = [[2, 1], [1, 2], [1, 2], [1, 2], [2, 1], [1, 1], [1, 2], [2, 2]]
    s = Solution()
    ans = s.numEquivDominoPairs(dominoes)
    print(ans)

猜你喜欢

转载自blog.csdn.net/weixin_45666660/article/details/113174295