AI 刷题 78. 分组飞行棋棋子 题解 | 豆包MarsCode AI刷题

108 阅读3分钟

image.png

问题分析

小M和小F在玩飞行棋,游戏结束后,他们需要将桌上的 N 个棋子按照序号分成 M 组,每组恰好包含 5 个相同序号的棋子。我们需要判断是否可以根据这个要求将所有棋子分组。

问题的核心是:我们需要检查棋子的序号是否能被分成若干个包含 5 个相同棋子的组。如果是,输出 True,否则输出 False

解题思路

  1. 检查每个序号的棋子数量

    • 我们首先需要统计每个序号出现的次数。可以通过哈希表(字典)来记录每个棋子序号出现的频次。
  2. 检查是否能够整除5

    • 对于每一个序号出现的次数,我们需要检查它能否被 5 整除。只有当某个序号的棋子数量是 5 的倍数时,才能分成完整的组。
  3. 计算总组数

    • 如果所有序号的棋子数量都是 5 的倍数,我们可以通过计算每种棋子出现的次数除以 5 得到组数。所有的组数应该正好等于 M
  4. 边界条件

    • 如果棋子的总数 N 不是 5 的倍数,直接返回 False。因为无法整除 5,就无法分成完整的组。

算法步骤

  1. 统计每个棋子序号的出现次数。
  2. 检查每个序号出现次数是否是 5 的倍数。
  3. 如果是,计算需要的组数并检查是否与 M 相等。
  4. 如果棋子数量不满足条件,直接返回 False

解释代码

  1. 统计出现次数

    • Counter(chess_pieces):我们使用 Python 的 collections.Counter 类来统计每个棋子序号的出现次数。Counter 会返回一个字典,其中键是棋子的序号,值是该序号出现的次数。
  2. 检查每个序号的数量是否是 5 的倍数

    • 对于每一个棋子的数量,如果它不是 5 的倍数,我们直接返回 False,表示不能按照要求分组。
  3. 计算总的组数

    • 如果某个序号的棋子数量是 5 的倍数,我们通过 count // 5 计算可以形成多少个组,并将这些组数累加到 total_groups 中。
  4. 返回结果

    • 如果所有的棋子都可以分成 5 个一组,并且总组数大于 0,那么返回 True,否则返回 False

复杂度分析

  • 时间复杂度

    • 统计每个棋子序号的出现次数需要 O(N) 时间,其中 N 是棋子的数量。
    • 遍历 Counter 中的每个元素也需要 O(K) 时间,其中 K 是不同棋子序号的个数。通常 K <= N,因此总的时间复杂度是 O(N)
  • 空间复杂度

    • 我们使用 Counter 来存储棋子序号及其出现次数,占用的空间是 O(K),其中 K 是不同棋子序号的个数,最大为 N

示例分析

示例1:

输入:chess_pieces = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2]

  • 棋子序号 1 出现了 5 次,棋子序号 2 也出现了 5 次。
  • 两种序号的棋子都可以组成完整的组。因此,总共能组成 2 组,返回 True

示例2:

输入:chess_pieces = [1, 2, 3, 4, 5]

  • 每种棋子的数量都是 1,无法组成 5 个一组的分组。因此返回 False

总结

该题通过统计每个棋子序号出现的次数,并检查这些次数是否是 5 的倍数,从而判断是否能根据要求分组。算法简单高效,时间复杂度和空间复杂度均为 O(N),能够在大多数情况下快速解决问题。

image.png