检查好数组【LC1250】
给你一个正整数数组
nums
,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。假如该和结果为
1
,那么原数组就是一个「好数组」,则返回True
;否则请返回False
。
积累知识~
「裴蜀定理」的内容为:对于不全为零的任意整数 aaa 和 bbb,记 g=gcd(a,b)g=gcd(a,b)g=gcd(a,b),其中 gcd(a,b)gcd(a,b)gcd(a,b) 为 aaa和 bbb的最小公约数,则对于任意整数 xxx 和 yyy 都满足 a×x+b×ya×x+b×ya×x+b×y 是 g 的倍数,特别地,存在整数 xxx 和 yyy满足 a×x+b×y=ga×x+b×y=ga×x+b×y=g。
「裴蜀定理」也可以推广到多个整数的情况。对于不全为零的任意 nnn 个整数,记这 nnn个数的最大公约数为 ggg,则对于任意 nnn个整数 都满足 ∑i=1nai×xi\sum_{i = 1}^n a_i\times x_i∑i=1nai×xi是 ggg 的倍数。一个重要的推论是:正整数 a1a_1a1到 ana_nan 的最大公约数是 1 的充分必要条件是存在 nnn 个整数 x1x_1x1到 xnx_nxn 满足 ∑i=1nai×xi=1\sum_{i = 1}^n a_i \times x_i = 1∑i=1nai×xi=1
-
思路:根据「裴蜀定理」,如果数组中元素的最大公约数为1,那么这个数组一定是好数组
class Solution { public boolean isGoodArray(int[] nums) { int ans = nums[0]; for (int i = 1; i < nums.length; i++){ ans = gcd(ans, nums[i]); if (ans == 1) return true; } return ans == 1; } public int gcd(int x, int y){ if (y == 0){ return x; } return gcd(y, x % y); } }
-
复杂度分析
- 时间复杂度:O(n+logm)O(n+logm)O(n+logm),假设数组中元素的最大值为mmm
- 空间复杂度:O(1)O(1)O(1)
-