数学:数组之卡牌分组
问题:
思路:
计算出数组中每个元素出现的次数,若要能完成题目中的分组要求,则它们的最大公约数至少为2
使用一个数组统计元素出现的次数,此数组的下标即为原数组中元素的值
对新创建的数组的非0元素进行遍历,使用gcd函数计算最大公约数,设由上一非0元素得到的最大公约数为g,g的初值为0( 因此第一个非0元素计算得到的最大公约数即为其自身 ),下一非0元素与g求最大公约数,依次类推。若出现最大公约数小于2的情况,则返回false
代码中使用了基于范围的for循环:
例如:
for( double x:prices )
for循环括号内声明了一个类型与容器存储的内容类型相同的变量(x),然后指出容器名(prices)。接下来,循环体使用指定变量x依次访问容器的每个元素( 即x的值依次等于容器中的每个元素的值 )
代码中使用了欧几里得算法求最大公约数,gcd包含在头文件algorithm中
gcd(m,n)原理:
step1:若n=0,return;否则转step2
step2:m除以n,将余数赋给r
step3:将n的值赋给m, r的值赋给n,返回step1
int gcd( int m,int n)
{
int r;
while( n!=0 )
{
r=m%n;
m=n;
n=r;
}
return m;
}
代码:
class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
int table[10000]={0};
int g=0;
for( int i: deck )
table[ i ]++;
for( int j: table )
{
if( j==0 ) //跳过0元素
continue;
g=gcd( j,g );
if( g<2 )
return false;
}
return true;
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153871.html