📌  相关文章
📜  找到一个数组元素,以使所有元素都能被它整除(1)

📅  最后修改于: 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),区别在于辗转相除法是用除法来求最大公约数,而质因数分解法是用乘法来求最大公因数。如果数据较小,两种方法都可以使用,如果数据较大,质因数分解的方法更加高效。