LeetCode每日一题(2023/2/15)


1250. 检查「好数组」

给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。

假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True;否则请返回 False。


示例 1:

输入:nums = [12,5,7,23]
输出:true
解释:挑选数字 5 和 7。
5*3 + 7*(-2) = 1
示例 2:

输入:nums = [29,6,10]
输出:true
解释:挑选数字 29, 6 和 10。
29*1 + 6*(-3) + 10*(-1) = 1
示例 3:

输入:nums = [3,6]
输出:false
 

提示:

1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9

解答:设a1,a2,a3……an为n个整数,d是它们的最大公约数,那么存在整数x1……xn使得x1a1+x2a2+…xn*an=d。

特别来说,如果a1…an存在任意两个数是互质的(不必满足两两互质),那么存在整数x1……xn使得x1a1+x2a2+…xn*an=1。证法类似两个数的情况。

class Solution {
    //根据裴蜀定理求最大公约数是否为1
    public boolean isGoodArray(int[] nums) {
        int res=0;
        for(int n:nums){
            res=gcd(res,n);
        }
        return res==1;
    }
    int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
}

  目录