AI 刷题 78 | 豆包MarsCode AI刷题

69 阅读2分钟

问题描述

小M和小F在玩飞行棋。游戏结束后,他们需要将桌上的飞行棋棋子分组整理好。现在有 N 个棋子,每个棋子上有一个数字序号。小M的目标是将这些棋子分成 M 组,每组恰好5个,并且组内棋子的序号相同。小M希望知道是否可以按照这种方式对棋子进行分组。 例如,假设棋子序号为 [1, 2, 3, 4, 5],虽然只有5个棋子,但由于序号不同,因此不能形成有效的分组。如果序号是 [1, 1, 1, 1, 1, 2, 2, 2, 2, 2],则可以形成两个有效分组,因此输出为 True

测试样例

样例1:

输入:nums = [1, 2, 3, 4, 5]
输出:"False"

样例2:

输入:nums = [1, 1, 1, 1, 2, 1, 2, 2, 2, 2]
输出:"True"

样例3:

输入:nums = [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]
输出:"True"

样例4:

输入:nums = [7, 7, 7, 8, 8, 8, 8, 8, 7, 7]
输出:"True"

样例5:

输入:nums = [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
输出:"False"

问题分析

  1. 输入条件

    • 棋子总数为N。
    • 棋子的序号为一个数组,长度为N。
    • 每组需要恰好5个棋子。
    • 每组内的棋子序号需要相同。
  2. 输出条件

    • 如果可以分成M组满足要求,输出True
    • 否则,输出False
  3. 约束条件

    • N必须能被5整除,否则无法分成M组。
    • 每个序号的棋子数量必须是5的倍数,否则无法满足“每组恰好5个且序号相同”的要求。

解决思路

  1. 预处理

    • 使用一个字典统计每种棋子序号的数量。
  2. 基本判断

    • 首先检查N是否可以被5整除。如果不能直接返回False
  3. 分组验证

    • 遍历每种棋子序号的数量,检查是否可以被5整除。如果某种棋子的数量不能被 5 整除,则无法完成分组,返回 False
    • 如果所有棋子都可以被分成5的倍数组,则返回 True

经过上述分析,很容易想到使用counter函数统计各个棋子序号的数量。于是便可得到下述代码:

image.png

复杂度分析

  1. 时间复杂度

    • 构建计数字典需要O(N),其中N是棋子总数。
    • 遍历计数字典需要O(k),其中k是不同棋子序号的种类数,k≤N。
    • 因此总时间复杂度为O(N)。
  2. 空间复杂度

    • 计数字典需要O(k)的额外空间。
    • 总空间复杂度为O(k),其中k≤N。