豆包MarsCode AI 刷题——多米诺骨牌等价队的数量 | 豆包MarsCode AI刷题

82 阅读3分钟

屏幕截图 2024-11-22 233302.png

问题思路

在这道关于多米诺骨牌等价对数量的题目中,我们要处理一组多米诺骨牌。两张多米诺骨牌dominoes[i]=[a, b]和dominoes[j]=[c, d]等价的条件是(a == c and b == d)或者(a == d and b == c),也就是说一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张等价的多米诺骨牌。我们的任务是在0 <= i < j < dominoes.length的前提下,计算出有多少对多米诺骨牌是等价的。

问题详解

首先,创建了一个字典count_dict来存储每种标准化后的多米诺骨牌的出现次数。这里的标准化操作是将多米诺骨牌中较小的数字放在前面,通过normalized_domino=(min(domino[0], domino[1]), max(domino[0], domino[1]))实现。

然后,遍历每一张多米诺骨牌,对于标准化后的多米诺骨牌,如果它已经在字典中,就将其计数加 1,否则将其加入字典并初始化为 1。

计算等价对数:定义变量equivalent_pairs来存储等价对的数量;遍历字典count_dict中的值(即每种标准化多米诺骨牌的数量),当数量大于 1 时,通过组合数公式count*(count - 1)//2计算出这种多米诺骨牌能组成的等价对数量,并累加到equivalent_pairs中。

代码

def solution(dominoes: list) -> int: # 创建一个字典来存储每种标准化后的多米诺骨牌的出现次数 count_dict = {}

# 遍历每张多米诺骨牌
for domino in dominoes:
    # 标准化多米诺骨牌,将较小的数字放在前面
    normalized_domino = (min(domino[0], domino[1]), max(domino[0], domino[1]))
    
    # 更新字典中的计数
    if normalized_domino in count_dict:
        count_dict[normalized_domino] += 1
    else:
        count_dict[normalized_domino] = 1

# 计算等价对数
equivalent_pairs = 0
for count in count_dict.values():
    if count > 1:
        # 计算组合数 C(count, 2)
        equivalent_pairs += count * (count - 1) // 2

return equivalent_pairs

if name == 'main': print(solution(dominoes=[[1, 2], [2, 1], [3, 4], [5, 6]]) == 1) print(solution(dominoes=[[1, 2], [2, 1], [1, 2], [2, 1]]) == 6) print(solution(dominoes=[[3, 3], [3, 3], [3, 3], [3, 3]]) == 6)

知识总结

在解决这类问题时,关键在于正确理解和应用哈希表的原理。首先,需要确定状态表示,即每张多米诺骨牌的标准化形式,以确保每对等价的多米诺骨牌具有相同的键值。其次,要明确状态转移方程,即如何从已知的状态推导出未知的状态。在本题中,状态转移方程为:如果normalized_domino在count_dict中,则count_dict[normalized_domino] += 1;否则,count_dict[normalized_domino] = 1。最后,初始化和边界条件的处理也非常关键,这有助于简化问题并避免不必要的计算。

结论

  通过上述分析可以看出,“多米诺骨牌等价对的数量”是一个考察组合计数思维的典型问题。在刷题的过程中,我们应该注重理解题目背后的逻辑,掌握哈希表的核心思想,并通过不断的练习来提高解题速度和准确性。同时,合理利用AI工具和其他资源,可以使我们的学习更加高效。希望每位编程学习者都能找到适合自己的学习方法,享受编程带来的乐趣。

工具运用

  豆包MarsCode AI不仅提供题目练习,还能即时反馈代码的正确性和效率。利用这一功能,可以快速定位代码中的错误并进行修正。此外,参与社区讨论也是提高编程能力的好方法,它可以帮助我们了解不同人的思维方式和解决问题的方法。建议初学者从简单题目开始,逐步过渡到复杂题目。每天至少解决一道题目,并尝试多种解法以拓宽思路。同时,重视错题的复习,分析错误原因,避免重复犯错。此外,定期回顾已学知识点,巩固记忆。