青训营X豆包MarsCode 技术训练营第七课 |AI 刷题 分组飞行棋 题解 | 豆包MarsCode AI刷题

74 阅读3分钟

一.问题描述

小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)。