等价多米诺骨牌对的数量-LeetCode
1128. 等价多米诺骨牌对的数量
🎯 问题描述(来源于LeetCode)
描述:
给你一个多米诺骨牌列表 dominoes,其中 dominoes[i] = [a, b]。
如果两个多米诺骨牌是等价的,即满足以下任一条件:
a == c且b == da == d且b == c
也就是说,骨牌可以旋转 180 度后相等。
请你找出列表中等价多米诺骨牌对的数量 (i, j),其中 0 <= i < j < dominoes.length。
说明:
-
这是一个哈希表计数问题。
-
核心逻辑是将骨牌标准化(例如排序),使得等价的骨牌拥有相同的键。
-
利用组合数学或累加计数法计算对数。
-
示例:
-
示例 1:
1 | 输入:dominoes = [[1,2],[2,1],[3,4],[5,6]] |
- 示例 2:
1 | 输入:dominoes = [[1,2],[1,2],[1,1],[1,2],[2,2]] |
💻 解题思路
思路1:哈希表 + 累加计数
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
- 时间复杂度:
- 其中 是
dominoes的长度。 - 遍历数组一次。
sorted(nums)的时间复杂度是 ,因为骨牌只有两个数字,排序操作是常数时间的。- 哈希表操作平均为 。
- 总时间复杂度为 。
- 其中 是
- 空间复杂度:
- 哈希表
num在最坏情况下需要存储 个键值对。
- 哈希表
思考
-
标准化(归一化):
- 多米诺骨牌
[a, b]和[b, a]是等价的。 - 为了在哈希表中将它们视为同一个键,我们需要对骨牌进行标准化。
- 代码中使用
tuple(sorted(nums)),将[2, 1]变为(1, 2),将[1, 2]也变为(1, 2)。这样就统一了键。
- 多米诺骨牌
-
累加计数原理:
- 假设某种骨牌已经出现了 次。
- 当我们遇到第 个该种骨牌时,它可以与之前的 个骨牌分别组成一对。
- 因此,新增的对数就是 。
- 代码中的
count += num[nums]正是利用了这一点。 - 这等价于最后计算组合数 ,但累加法可以在一次遍历中完成,无需最后再遍历哈希表。
-
逻辑流程:
- 遍历每个骨牌。
- 将其排序并转为元组,作为哈希表的键。
- 查看该键在哈希表中的当前计数
num[nums]。 - 将
num[nums]加到count中(表示当前骨牌与之前的骨牌组成了多少对)。 - 将
num[nums]加 1(更新计数)。
-
边界情况:
- 数组长度为 1:
count加 0,返回 0。 - 所有骨牌都不同:
num[nums]始终为 0,count始终为 0。 - 所有骨牌都相同:第 个骨牌会增加 个对数,总对数为 。
- 数组长度为 1:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






