数学:数组之卡牌分组

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。数学:数组之卡牌分组,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

数学:数组之卡牌分组

问题:

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

思路:

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!