【Lintcode】1728. X of a Kind in a Deck of Cards

题目地址:

https://www.lintcode.com/problem/x-of-a-kind-in-a-deck-of-cards/description

给定一个数组 A A A,将其分组成若干组(可以重排 A A A),使得每组的数字都相等,每组数字的个数相等,并且每组数字个数都至少是 2 2 2。返回这个每组数字个数。

先用哈希表统计每个数出现次数,答案其实就是所有出现次数的最大公约数。如果最大公约数是 1 1 1,则返回false,否则最后返回true。代码如下:

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Solution {
    /**
     * @param deck: a integer array
     * @return: return a value of bool
     */
    public boolean hasGroupsSizeX(List<Integer> deck) {
        // write your code here
        Map<Integer, Integer> map = new HashMap<>();
        for (int d : deck) {
            map.put(d, map.getOrDefault(d, 0) + 1);
        }
        
        // 求最少出现次数
        int x = deck.size();
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            x = Math.min(x, entry.getValue());
        }
        
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
        	// 求最大公约数,如果最大公约数是1,则返回false
            x = gcd(x, entry.getValue());
            if (x == 1) {
                return false;
            }
        }
        
        return true;
    }
    
    private int gcd(int x, int y) {
        while (y != 0) {
            int tmp = x % y;
            x = y;
            y = tmp;
        }
        
        return x;
    }
}

时间复杂度 O ( l A log ⁡ l A ) O(l_A\log l_A) O(lAloglA) log ⁡ l A \log l_A loglA的部分来自于求最大公约数,但实际时间要比这个小得多),空间 O ( l A ) O(l_A) O(lA)

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页