题目地址:
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)。