3月打卡活动第27天 LeetCode第914题:卡牌分组(简单)

3月打卡活动第27天 LeetCode第914题:卡牌分组(简单)

  • 题目:给定一副牌,每张牌上都写着一个整数。此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:每组都有 X 张牌。组内所有的牌上都写着相同的整数。仅当你可选的 X >= 2 时返回 true。
    在这里插入图片描述
  • 解题思路:利用HashMap计数,在逐一寻找X的值。有点笨哈
class Solution {
    public boolean hasGroupsSizeX(int[] deck) {
        HashMap<Integer,Integer> dec = new HashMap<>();
        int len = deck.length;
        if(len<2) return false;
        int num = 0;
        for(int i=0;i<len;i++){
            if(dec.containsKey(deck[i])){
                dec.put(deck[i],dec.get(deck[i])+1);
            }else{
                dec.put(deck[i],1);
                num++;
            }
        }
        if(len/num<2) return false;
        int k = dec.get(deck[0]);
        for(int j=2;j<=k;j++){
            int m = 0;
            for(Map.Entry<Integer,Integer> entry:dec.entrySet()){
                if(entry.getValue()%j!=0) break;
                m++;
            }
            if(m==num) return true;
        }
        
        return false;
    }
}

在这里插入图片描述

  • 题解做法:想到了最大公约数,没想到又用了数组这个做法。
    public int gcd(int x, int y) {
    return x == 0 ? y : gcd(y%x, x);
    }
    这种求最大公约数的写法要记下来。
class Solution {
    public boolean hasGroupsSizeX(int[] deck) {
        int[] count = new int[10000];
        for (int c: deck)
            count[c]++;

        int g = -1;
        for (int i = 0; i < 10000; ++i)
            if (count[i] > 0) {
                if (g == -1)
                    g = count[i];
                else
                    g = gcd(g, count[i]);
            }

        return g >= 2;
    }

    public int gcd(int x, int y) {
        return x == 0 ? y : gcd(y%x, x);
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/solution/qia-pai-fen-zu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
发布了111 篇原创文章 · 获赞 17 · 访问量 2911

猜你喜欢

转载自blog.csdn.net/new_whiter/article/details/105134172