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]

示例 2:
输入:[1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。

示例 3:
输入:[1]
输出:false
解释:没有满足要求的分组。

示例 4:
输入:[1,1]
输出:true
解释:可行的分组是 [1,1]

示例 5:
输入:[1,1,2,2,2,2]
输出:true
解释:可行的分组是 [1,1],[2,2],[2,2]
 
提示:
 1 <= deck.length <= 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);
    }
代码:
 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 }

 

 
posted @ 2020-03-27 16:12  一二三的三二一  阅读(202)  评论(0)    收藏  举报