这道题的核心思路是利用贝祖定理(Bézout's identity),该定理指出对于任意整数a和b,如果d是它们的最大公约数,那么一定存在整数x和y,使得ax + by = d。根据这个定理,如果数组中所有元素的最大公约数为1,那么就可以通过这些元素的线性组合得到1,即存在一种组合使得最终和为1。因此,我们只需要计算数组中所有数的最大公约数是否为1即可。实现上,我们从数组的第一个元素开始,依次计算与下一个元素的最大公约数,直到遍历完整个数组,如果过程中最大公约数变为1,就可以提前结束遍历返回True。如果遍历完成后最大公约数仍然是1,则返回True,否则返回False。
时间复杂度: O(n * logN)
空间复杂度: O(1)
from math import gcd
from typing import List
class Solution:
def isGoodArray(self, nums: List[int]) -> bool:
# 初始化最大公约数为 0
g = 0
# 遍历数组中的每个数
for num in nums:
# 使用 gcd 函数更新最大公约数
g = gcd(g, num)
# 如果最大公约数为 1,则可以提前返回 True
if g == 1:
return True
# 返回最大公约数是否为 1
return g == 1
solution = Solution()
print(solution.isGoodArray([12, 5, 7, 23])) # 输出: True
print(solution.isGoodArray([29, 6, 10])) # 输出: True
print(solution.isGoodArray([3, 6])) # 输出: False