数学:数组之卡牌分组

数学:数组之卡牌分组

问题:

在这里插入图片描述
在这里插入图片描述

思路:

计算出数组中每个元素出现的次数,若要能完成题目中的分组要求,则它们的最大公约数至少为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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

happy19991001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值