LeetCode每日一题5.4
1128. 等价多米诺骨牌对的数量
问题
问题分析
等价的定义为:两个骨牌 [a, b] 和 [c, d] 等价,当且仅当 (a == c 且 b == d) 或者 (a == d 且 b == c)。
思路
标准化骨牌表示:
为了方便比较,我们可以将每个骨牌 [a, b] 标准化为 [min(a, b), max(a, b)]。这样可以确保 [a, b] 和 [b, a] 都表示为相同的形式。
计数标准化后的骨牌:
使用一个字典来记录每个标准化后骨牌的出现次数。
计算等价骨牌对数量:
对于每个标准化骨牌,如果其出现次数为 n,则可以形成 C(n, 2) = n * (n - 1) / 2 个等价骨牌对。
代码
class Solution:def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:# 字典用于记录标准化骨牌的出现次数count = {}result = 0for domino in dominoes:# 标准化骨牌standardized_domino = tuple(sorted(domino))# 更新字典中的计数if standardized_domino in count:count[standardized_domino] += 1else:count[standardized_domino] = 1# 计算等价骨牌对的数量for value in count.values():if value > 1:result += value * (value - 1) // 2return result
复杂度分析
时间复杂度
标准化骨牌:对于每个骨牌,标准化操作(排序)的时间复杂度为 (O(1))(因为每个骨牌只有两个元素)。
遍历骨牌数组:时间复杂度为 (O(n)),其中 (n) 是骨牌数组的长度。
更新字典:每次更新操作的时间复杂度为 (O(1))。
计算等价骨牌对:遍历字典值并计算组合数,时间复杂度为 (O(m)),其中 (m) 是不同标准化骨牌的数量。
因此,整体时间复杂度为 (O(n)),其中 (n) 是骨牌数组的长度。
空间复杂度
字典存储:空间复杂度为 (O(m)),其中 (m) 是不同标准化骨牌的数量。
综上所述,该算法的时间复杂度为 (\boxed{O(n)}),空间复杂度为 (\boxed{O(m)})。
学习
遍历骨牌数组,对每个骨牌进行标准化。
使用字典记录 每个标准化骨牌的出现次数。
根据字典中的值,计算等价骨牌对的数量。