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
解法
方法一:数学(裴蜀定理)
我们先可以考虑选取两个数的情况,若选取的数是 $a$ 和 $b$,那么根据题目的要求,我们需要满足 $a \times x + b \times y = 1$,其中 $x$ 和 $y$ 是任意整数。
根据裴蜀定理,可以得知,如果 $a$ 和 $b$ 互质,那么上述等式一定有解。实际上,裴蜀定理也可以推广到多个数的情况,即如果 $a_1, a_2, \cdots, a_i$ 互质,那么 $a_1 \times x_1 + a_2 \times x_2 + \cdots + a_i \times x_i = 1$ 一定有解,其中 $x_1, x_2, \cdots, x_i$ 是任意整数。
因此,我们只需要判断在数组 nums
中是否存在 $i$ 个互质的数即可。两个数互质的充要条件是它们的最大公约数为 $1$。如果数组 nums
存在 $i$ 个互质的数,那么数组 nums
中的所有数的最大公约数也为 $1$。
所以我们将题目转化为:判断数组 nums
中的所有数的最大公约数是否为 $1$。遍历数组 nums
,求出数组 nums
中的所有数的最大公约数即可。
时间复杂度 $O(n + log m)$,空间复杂度 $O(1)$,其中 $n$ 是数组 nums
的长度,而 $m$ 是数组 nums
中的最大值。
1 2 3 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 |
|