检查好数组
题目
给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。
假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True;否则请返回 False。
示例
输入:nums = [29,6,10]
输出:true
解释:挑选数字 29, 6 和 10。
29 * 1 + 6 * (-3) + 10 *(-1) = 1
题解
计算最大公约数
最大公约数 (GCD greatest common divisor); 可以使用欧几里得算法(又称辗转相除法):
假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里德算法,是这样进行的:
1997 ÷ 615 = 3 (余 152)
615 ÷ 152 = 4(余7)
152 ÷ 7 = 21(余5)
7 ÷ 5 = 1 (余2)
5 ÷ 2 = 2 (余1)
2 ÷ 1 = 2 (余0)
至此,最大公约数为1
以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数
public int gcd(int a, int b) {
int big = a > b ? a : b;
int small = a > b ? b : a;
int gcd = small;
while (big % small != 0) {
gcd = big % small;
big = small;
small = gcd;
}
return gcd;
}
求证 GCD(A,B)=GCD(B,R), 其中 R = A%B :
不妨设A > B, A = kB + R
假设D是A,B的一个公约数,R = A - kB 两边同时除以D, 则R/D = A/D - KB/D 也为整数,故D也是R的约数;
假设P是B, R的公约数,A = kB + R 两边同时除以P, 则A/P = kB/P + R/P 也是整数,故P也是A的约数;
因此, (A,B)和(B,R)的公约数是一样的,那么他们的最大公约数也必然相等。
裴蜀定理
所以该题等价为 判断该数组的最大公约数是否为1
标签:1250,int,big,最大公约数,数组,small,leetcode,gcd From: https://www.cnblogs.com/rachel-aoao/p/leetcode_1250_check-if-it-is-a-good-array.html