leetcode 914.卡牌分组
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:
每组都有 X 张牌。
组内所有的牌上都写着相同的整数。
仅当你可选的 X >= 2 时返回 true。
示例 1:
输入:[1,2,3,4,4,3,2,1]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]
示例 2:
输入:[1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。
输出:false
解释:没有满足要求的分组。
示例 3:
输入:[1]
输出:false
解释:没有满足要求的分组。
输出:false
解释:没有满足要求的分组。
示例 4:
输入:[1,1]
输出:true
解释:可行的分组是 [1,1]
输出:true
解释:可行的分组是 [1,1]
示例 5:
输入:[1,1,2,2,2,2]
输出:true
解释:可行的分组是 [1,1],[2,2],[2,2]
输出:true
解释:可行的分组是 [1,1],[2,2],[2,2]
提示:
1 <= deck.length <= 10000
0 <= deck[i] < 10000
0 <= deck[i] < 10000
思路:统计vector容器中的所有数出现的次数,再求出这些次数的最大公约数,若公约数大于等于2,满足要求,否则不满足。
最大公约数的求法:
(1)辗转相除法
int gcd(int x, int y)
{
if (x % y == 0)
return y;
else
return gcd(y,x % y);
}
{
if (x % y == 0)
return y;
else
return gcd(y,x % y);
}
代码:
1 #include"iostream" 2 #include"vector" 3 //#include"algorithm" 4 using namespace std; 5 #define MAX_LENGTH 10000 6 class Solution { 7 public: 8 int record_map[MAX_LENGTH] = { 0 }; 9 10 int gcd(int x, int y) 11 { 12 if (x % y == 0) 13 return y; 14 else 15 return gcd(y,x % y); 16 } 17 18 bool hasGroupsSizeX(vector<int>& deck) 19 { 20 vector<int>::iterator it; 21 for (it = deck.begin(); it != deck.end(); it++) {//遍历deck 22 record_map[*it]++; //数组下标即为vector容器存储的值,出现一次加一次 23 } 24 int g = -1; 25 for (int i = 0; i < MAX_LENGTH; i++) 26 { 27 if (record_map[i] != 0) 28 { 29 if (~g) 30 { 31 g = gcd(g, record_map[i]); 32 } 33 else 34 { 35 g = record_map[i]; 36 } 37 } 38 } 39 if (g >= 2) 40 return true; 41 else 42 { 43 return false; 44 } 45 } 46 47 }; 48 49 //测试 50 int main() 51 { 52 vector<int> vec; 53 vec.push_back(1); 54 //vec.push_back(1); 55 //vec.push_back(2); 56 //vec.push_back(2); 57 //vec.push_back(2); 58 //vec.push_back(2); 59 //vec.push_back(3); 60 //vec.push_back(2); 61 62 Solution s1; 63 bool result = s1.hasGroupsSizeX(vec); 64 65 cout << result << endl; 66 67 system("pause"); 68 return 0; 69 }

浙公网安备 33010602011771号