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