leetcode - 1250 检查好数组

检查好数组

题目

给你一个正整数数组 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

posted @ 2023-02-15 11:22  rachel_aoao  阅读(18)  评论(0编辑  收藏  举报