一.问题描述
小M和小F在玩飞行棋。游戏结束后,他们需要将桌上的飞行棋棋子分组整理好。现在有 N 个棋子,每个棋子上有一个数字序号。小M的目标是将这些棋子分成 M 组,每组恰好5个,并且组内棋子的序号相同。小M希望知道是否可以按照这种方式对棋子进行分组。
例如,假设棋子序号为 [1, 2, 3, 4, 5],虽然只有5个棋子,但由于序号不同,因此不能形成有效的分组。如果序号是 [1, 1, 1, 1, 1, 2, 2, 2, 2, 2],则可以形成两个有效分组,因此输出为 True。
二.思路分析
要解决这个问题,我们需要确定是否可以将N个棋子分成M组,每组恰好5个棋子,且每组内的棋子序号相同。以下是解决这个问题的思路分析:
1. 关键点:
HashMap:去重
2. 统计每个序号的出现次数:
·使用一个数据结构(例如HashMap)来统计每个序号出现的次数。
3. 检查每个序号的棋子数量是否为5的倍数:
遍历HashMap,检查每个键(序号)对应的值(出现次数)是否是5的倍数。如果是,说明这个序号的棋子可以被完全分组;如果不是,说明这个序号的棋子不能被完全分组。
4.判断是否可以形成有效的分组:
如果HashMap中的所有值都是5的倍数,那么可以形成有效的分组,输出True。
如果HashMap中有任何值不是5的倍数,那么不能形成有效的分组,输出False。
5.考虑特殊情况:
如果N不是5的倍数,那么不可能将所有棋子分成每组恰好5个的组,直接输出False。
如果N是5的倍数,但HashMap中没有至少一个键的值大于或等于5,那么也不能形成有效的分组,输出False。
三.代码实现
import java.util.Map;
public class Main {
public static String solution(int[] nums) {
// Please write your code here
Map<Integer, Integer> countMap = new HashMap<>();
for (int num : nums) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
}
for (int count : countMap.values()) {
if (count % 5 != 0) {
return "False";
}
}
return "True";
}
四.复杂度
1.时间复杂度
1. HashMap的填入:
遍历数组nums并填充HashMap,这个操作的时间复杂度是O(N),其中N是数组nums的长度。
2. 检查HashMap的值:
遍历HashMap中的所有值来检查它们是否是5的倍数。这个操作的时间复杂度是O(K),其中K是HashMap中键值对的数量。在最坏的情况下,K可以接近N(如果所有数字都不同)。
所以时间复杂度为O(N)。
2.空间复杂度
HashMap的存储:
HashMap用于存储每个数字及其出现次数。在最坏的情况下,如果所有数字都不同,HashMap将存储N个键值对,因此空间复杂度是O(N)。