零、。。。。
跟着英雄哥学算法,每日打卡
https://bbs.csdn.net/topics/603094149https://bbs.csdn.net/topics/603094149
零.五、英雄哥算法详解
一、题目
力扣https://leetcode-cn.com/problems/number-of-different-subsequences-gcds/
二、思路
int gcd(int a,int b) //(1)求最大公约数
{
return !b?a:gcd(b,a%b);
}
int Max(int a,int b) //(2)求数组中最大的数,因为公约数肯定是从0到Ma下,之间的
{
return a>b?a:b;
}
int countDifferentSubsequenceGCDs(int* nums, int numsSize) //(3)int*nums表示题给定的数
组int numsSize表示给定
数组的长度
{
int has[200001]; //数是0-200000的,往下看
int m=0,ans=0,j,i,t;
memset(has,0,sizeof(has)); //memset 初始化数组全都是零,不知道的去百度一下memset
for(i=0;i<numsSize;++i) //我之前见就不认识
{
m=Max(m,nums[i]);
has[nums[i]]=1; //把nums中的数据变成has的下标,存在的把has标记成1
}
for(i=1;i<=m;++i) //从零开始枚举因数
{
t=0;
for(j=i;j<=m;j+=i) //......
{
if(has[j]) //如果枚举的因数在nums里存在
{
t=gcd(t,j); //求最大公因数,任何数与0求都等于它本身,可能1倍i不存在,那就循环看
看2倍的i,3倍的i存在, 求他们的最大公因数 之后回到上一个for举下一
个i。
}
}
if(t==i) //举得i要是和求的t相等 就加一
要是不等 那不要了? 等到举的时候不就等了
{
++ans;
}
}
return ans; //返回最大公因数的个数
}
(1)太难了,没有思路,就是理解了一下英雄哥的代码,把我看不懂的解释解释,加上一些,我自己的理解
(2)代码和英雄哥的差不多(内容是一样的),代码是理解之后自己打的,然后总是有错误,为了方便我找错,改的越来越像
(3)6 4 12 可以6 4找 找完结果再和12找
三、结果