📅  最后修改于: 2023-12-03 15:25:50.023000             🧑  作者: Mango
在这个问题中,我们需要找到一个数,使得数组中所有的元素都能被它整除。换句话说,这个数就是数组的最小公倍数。我们可以通过求出数组中所有数的最大公约数来解决这个问题。
辗转相除法是求最大公约数的常用算法,它的思路是不断取两个数的余数,直到其中一个数为0,此时另一个数就是最大公约数。
def gcd(a, b):
return gcd(b, a % b) if b != 0 else a
def lcm(nums):
result = nums[0]
for i in range(1, len(nums)):
result = result * nums[i] // gcd(result, nums[i])
return result
时间复杂度:O(nlogn)
我们可以将每个数进行质因数分解,然后将它们的公共质因数相乘即可,这个积就是最大公约数。具体实现可以先将每个数进行质因数分解,然后用一个字典保存每个质因数出现的最大次数,最后将这些质因数的乘积求出来即可。
def prime_factors(n):
factors = {}
for i in range(2, int(n ** 0.5) + 1):
while n % i == 0:
factors[i] = factors.get(i, 0) + 1
n //= i
if n > 1:
factors[n] = factors.get(n, 0) + 1
return factors
def lcm(nums):
factors = {}
for num in nums:
for k, v in prime_factors(num).items():
factors[k] = max(factors.get(k, 0), v)
result = 1
for k, v in factors.items():
result *= k ** v
return result
时间复杂度:O(nlogn)
两种解法的时间复杂度都是O(nlogn),区别在于辗转相除法是用除法来求最大公约数,而质因数分解法是用乘法来求最大公因数。如果数据较小,两种方法都可以使用,如果数据较大,质因数分解的方法更加高效。