标签:Kind gcd Deck int Explanation Input Output Example GCD
n a deck of cards, each card has an integer written on it.
Return true if and only if you can choose X >= 2 such that it is possible to split the entire deck into 1 or more groups of cards, where:
Each group has exactly X cards.
All the cards in each group have the same integer.
Example 1:
Input: [1,2,3,4,4,3,2,1]
Output: true
Explanation: Possible partition [1,1],[2,2],[3,3],[4,4]
Example 2:
Input: [1,1,1,2,2,2,3,3]
Output: false
Explanation: No possible partition.
Example 3:
Input: [1]
Output: false
Explanation: No possible partition.
Example 4:
Input: [1,1]
Output: true
Explanation: Possible partition [1,1]
Example 5:
Input: [1,1,2,2,2,2]
Output: true
Explanation: Possible partition [1,1],[2,2],[2,2]
Note:
1 <= deck.length <= 10000
0 <= deck[i] < 10000
分析:本题的意思是判断给出数组中出现的数字出现的次数,能不能够被分割成
1.每一部分都大于2的
2.每一部分的数都相同的
满足两个条件。
可以想到的是,可以使用unordered_map或者map来统计数字出现的频率,然后判断。
但是一开始没想太清楚,没能想到是需要求所有数字出现次数的最大公约数。
而且复习了一下最大公约数GCD
bool hasGroupsSizeX(vector<int>& deck) {
unordered_map<int,int>m;
for(int i=0;i<deck.size();i++)
m[deck[i]]++;
int res = 0;
for(auto i :m)res = gcd(i.second,res);
return res>1;
}
int gcd(int a,int b){
if(a<=0&&b<=0)return -1;
if(a<=0)return b;
if(b<=0)return a;
if(a>b)return gcd(a-b,b);
else if(a<b)return gcd(a,b-a);
return a;
}
这里使用的是 更相减损法
int gcd(int a,int b){
if(a<=0||b<=0)return -1;
if(a>b)return gcd(a-b,b);
if(a<b)return gcd(a,b-a);
return a;
}
还有辗转相除法
int gcd(int a,int b){
if(a==0)return b;
return gcd(b%a,a);
}
标签:Kind,gcd,Deck,int,Explanation,Input,Output,Example,GCD 来源: https://blog.csdn.net/qq_34326845/article/details/88044621
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。