问题描述
小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"
问题分析
-
输入条件:
- 棋子总数为N。
- 棋子的序号为一个数组,长度为N。
- 每组需要恰好5个棋子。
- 每组内的棋子序号需要相同。
-
输出条件:
- 如果可以分成M组满足要求,输出
True。 - 否则,输出
False。
- 如果可以分成M组满足要求,输出
-
约束条件:
- N必须能被5整除,否则无法分成M组。
- 每个序号的棋子数量必须是5的倍数,否则无法满足“每组恰好5个且序号相同”的要求。
解决思路
-
预处理:
- 使用一个字典统计每种棋子序号的数量。
-
基本判断:
- 首先检查N是否可以被5整除。如果不能直接返回
False。
- 首先检查N是否可以被5整除。如果不能直接返回
-
分组验证:
- 遍历每种棋子序号的数量,检查是否可以被5整除。如果某种棋子的数量不能被 5 整除,则无法完成分组,返回
False。 - 如果所有棋子都可以被分成5的倍数组,则返回
True。
- 遍历每种棋子序号的数量,检查是否可以被5整除。如果某种棋子的数量不能被 5 整除,则无法完成分组,返回
经过上述分析,很容易想到使用counter函数统计各个棋子序号的数量。于是便可得到下述代码:
复杂度分析
-
时间复杂度:
- 构建计数字典需要O(N),其中N是棋子总数。
- 遍历计数字典需要O(k),其中k是不同棋子序号的种类数,k≤N。
- 因此总时间复杂度为O(N)。
-
空间复杂度:
- 计数字典需要O(k)的额外空间。
- 总空间复杂度为O(k),其中k≤N。