思路
x从1到最大循环,如果m是x的倍数,n也是x的倍数,并且m,n的最大公因数是x,则【m,n】符合条件。 如果m,n的最大公因数是k,那么k一定是x的倍数。 因为 kk1=m,kk2=n,xx1=m,kk1=xx1; x=kk1/x1,因为x是整数,所以k1/x1是证整数。
代码
原始代码
public int countDifferentSubsequenceGCDs02(int[] nums) {
int maxVal = Arrays.stream(nums).max().getAsInt();
boolean[] isContain=new boolean[maxVal+1];// 判断 某个元素是否在nums中出现
for (int num : nums) {
isContain[num]=true;
}
int res=0;
for (int i = 1; i <=maxVal; i++) {
int tempMaxGYS=0; // 暂时最大公因数 0与任何数的最大公因数是这个数
for (int j = i; j <=maxVal; j+=i) { //j是i的倍数
if (isContain[j]){
tempMaxGYS=gcd(tempMaxGYS,j);
}
if (i==tempMaxGYS){// 找到一个
res++;
break;
}
}
}
return res;
}
public int gcd(int num1, int num2) {
while (num2 != 0) {
int temp = num1;
num1 = num2;
num2 = temp % num2;
}
return num1;
}
子序列长度为1, j只需要到i,如果子序列长度至少为2,i不在num中,此时j至少到2i,3i.
优化