914. 卡牌分组
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:
- 每组都有 X 张牌。
- 组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2 时返回 true。
解题思路: 此题本质上在考察多个数的最大公约数,这个最大公约数即是本题要求的X值。由于解法1中可能存在大量冗余公约数的计算,因此用一个记忆数组保存下来,加快计算,看解法2。
- 解法1
class Solution {
public:
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
bool hasGroupsSizeX(vector<int>& deck) {
unordered_map<int, int> cnt;
for (auto d : deck) ++cnt[d];
bool first = true;
int g;
for (auto it : cnt) {
if (first) {
g = it.second;
first = false;
} else {
g = gcd(g, it.second);
}
}
return g >= 2;
}
};
- 解法2
class Solution {
public:
int gcd(int a, int b) {
if (memo[{a, b}] != 0) return memo[{a, b}];
int res = (b == 0 ? a : gcd(b, a % b));
return memo[{a, b}] = res;
}
bool hasGroupsSizeX(vector<int>& deck) {
unordered_map<int, int> cnt;
for (auto d : deck) ++cnt[d];
bool first = true;
int g;
for (auto it : cnt) {
if (first) {
g = it.second;
first = false;
} else {
g = gcd(g, it.second);
}
}
return g >= 2;
}
private:
map<pair<int, int>, int> memo;
};