题目描述
题目链接:1250. 检查「好数组」
给你一个正整数数组 nums
,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数
,并求出他们的和。
假如该和结果为 1
,那么原数组就是一个「好数组」
,则返回 True
;否则请返回 False
。
示例 1
输入:nums = [12,5,7,23]
输出:true
解释:挑选数字 5 和 7。
53 + 7(-2) = 1
示例 2
输入:nums = [29,6,10]
输出:true
解释:挑选数字 29, 6 和 10。
291 + 6(-3) + 10*(-1) = 1
示例 3
输入:nums = [3,6]
输出:false
提示
- 1 <=
nums.length
<= 10^5 - 1 <=
nums[i]
<= 10^9
解题核心
判断是否为好数组的关键就是判断 ∑ i = 1 n a i × x i = 1 \sum_{i=1}^{n} a_{i} \times x_{i} = 1 ∑i=1nai×xi=1是否有解,根据题目提示可以参考裴蜀定理
解法一:数论
题目等价于求数组中的全部数字的最大公约数是否等于1,若等于1则原数组为「好数组」,否则不是。
public boolean isGoodArray(int[] nums) {
int res = 0;
for (int num : nums) {
res = gcd(res, num);
if (res == 1) return true;
}
return false;
}
//辗转相除法
public int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);//b等于0说明上一次递归调用的时候b是a的整数倍
}