卡牌分组
难度:
标签:
题目描述
代码结果
运行时间: 28 ms, 内存: 16.9 MB
/*
* 思路:
* 1. 使用Java Stream来统计每个数字出现的频率。
* 2. 通过reduce方法计算这些频率的最大公约数(GCD)。
* 3. 如果GCD >= 2,则可以进行分组,返回true;否则返回false。
*/
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
public class Solution {
public boolean hasGroupsSizeX(int[] deck) {
// 统计每个数字的频率
Map<Integer, Long> count = Arrays.stream(deck)
.boxed()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
// 计算所有频率的最大公约数
int gcdValue = count.values().stream()
.mapToInt(Long::intValue)
.reduce(-1, (a, b) -> a == -1 ? b : gcd(a, b));
// 如果最大公约数>=2,则返回true,否则返回false
return gcdValue >= 2;
}
// 计算两个数的最大公约数
private int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
}
解释
方法:
该题解首先使用Counter类来统计每个数字在牌组中出现的次数。然后使用reduce函数结合gcd(最大公约数)方法来计算所有计数值的最大公约数。如果这个最大公约数大于或等于2,意味着所有的牌都可以按照这个数量分组,每组牌的数量都是相同的。
时间复杂度:
O(n + k)
空间复杂度:
O(k)
代码细节讲解
🦆
为什么在这个问题中选择使用Counter类来统计各个数字的出现次数,而不是其他数据结构?
▷🦆
题解中提到使用reduce和gcd来计算最大公约数,能否解释gcd如何应用在不同数目的牌之间以确定是否可以分组?
▷🦆
在题解中计算最大公约数时,如果存在某个数字的牌只有一张,这会如何影响算法的输出结果?
▷🦆
题解中使用reduce函数结合gcd方法,这种方法在实际应用中是否总是有效?例如,如果计数值很大,计算gcd会有性能问题吗?
▷