• 2022.08.08_每日一题


    914. 卡牌分组

    题目描述

    给定一副牌,每张牌上都写着一个整数。

    此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:

    • 每组都有 X 张牌。
    • 组内所有的牌上都写着相同的整数。

    仅当你可选的 X >= 2 时返回 true

     

    示例 1:

    输入:deck = [1,2,3,4,4,3,2,1]
    输出:true
    解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]

    示例 2:

    输入:deck = [1,1,1,2,2,2,3,3]
    输出:false
    解释:没有满足要求的分组。


    提示:

    • 1 <= deck.length <= 104
    • 0 <= deck[i] < 104

    coding

    class Solution {
        public boolean hasGroupsSizeX(int[] deck) {
            Map<Integer, Integer> map = new HashMap<>();
    
            // 计数
            for (int i : deck) {
                map.put(i, map.getOrDefault(i, 0) + 1);
            }
    
            int len = map.size();
            int[] arr = new int[len];
            int index = 0;
    
            // cnt -> arr
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                arr[index ++] = entry.getValue();
            }
    
            // if (arr.min < 2) -> 存在 cnt < 2 的元素 -> return false;
            if (Arrays.stream(arr).min().getAsInt() < 2) {
                return false;
            }
    
            int max = Arrays.stream(arr).max().getAsInt();
    
            boolean flag = true;
    
            // 模拟找所有数的最大公约数
            for (int i = 2; i <= max; i ++) {
                flag = true;
                for (int j = 0; j < len; j ++) {
                    if (arr[j] % i != 0) {
                        flag = false;
                        break;
                    }
                }
                if (flag == true) {
                    break;
                }
            }
            return flag;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    class Solution {
        public boolean hasGroupsSizeX(int[] deck) {
            Map<Integer, Integer> map = new HashMap<>();
    
            // 计数
            for (int i : deck) {
                map.put(i, map.getOrDefault(i, 0) + 1);
            }
    
            int len = map.size();
            int[] arr = new int[len];
            int index = 0;
    
            // cnt -> arr
            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                arr[index ++] = entry.getValue();
            }
    
            int g = -1;
    
            for (int i = 0; i < arr.length; ++i) {
                if (arr[i] > 0) {
                    if (g == -1) {
                        g = arr[i];
                    } else {
                        g = gcd(g, arr[i]);
                    }
                }
            }
            return g > 1;
    
        }
    
        public int gcd(int x, int y) {
            return x == 0 ? y : gcd(y % x, x);
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
  • 相关阅读:
    哪个更快?document.addEventListener VS element.addEventListener
    寒假训练——第三周(线性DP)
    AlphaGo & Model-Based RL
    第 397 场 LeetCode 周赛题解
    IOS XCode Objectc SHA256加密
    SIP终端注册后无法收到呼入请求的情况说明
    第一篇、了解多线程
    [Angular 基础] - routing 路由(上)
    【LeetCode】187. 重复的DNA序列
    Android - Context
  • 原文地址:https://blog.csdn.net/qq_60717329/article/details/126231112