📌  相关文章
📜  查找 [L, R] 之间可被所有 Array 元素整除的数字(1)

📅  最后修改于: 2023-12-03 15:10:42.771000             🧑  作者: Mango

查找 [L, R] 之间可被所有 Array 元素整除的数字

在一个数组中,如果想要找到一个数,该数能被数组中所有元素同时整除,那么我们需要寻找的是该数组中所有元素的公共因子。

基础方法

最基本的方法是先找出数组中所有元素的最小值 min 和最大值 max,然后在 [min, max] 的范围内枚举每个数,判断该数是否能够被数组中所有元素整除。这种方法的时间复杂度为 O(n(m - n)),其中 n 表示数组中元素的个数,m 表示数组中元素的范围。这种方法的时间复杂度较高,无法应对大规模数据的场景。

优化方法

为了优化这种方法,我们可以先找出数组中元素的最大公约数,然后枚举最大公约数的所有因子,判断每个因子是否属于 [L, R] 范围内。这种方法的时间复杂度主要取决于最大公约数的因子个数,即 O(Δ(n)),其中 Δ(n) 表示 n 的因子个数。因为求最大公约数的时间复杂度为 O(n log n),所以这种方法的总时间复杂度为 O(n log n + Δ(m)),其中 m 表示 [L, R] 的范围。

下面是 Python 代码示例:

import math

def gcd(a, b):
    return a if b == 0 else gcd(b, a % b)

def calc(L, R, nums):
    n = len(nums)
    g = nums[0]
    for i in range(1, n):
        g = gcd(g, nums[i])
    res = 0
    for i in range(1, int(math.sqrt(g)) + 1):
        if g % i == 0:
            if L <= i <= R:
                res += 1
            if i != g // i and L <= g // i <= R:
                res += 1
    return res

该函数接受三个参数,分别代表 [L, R] 的区间范围和输入的 nums 数组。函数的返回值代表 [L, R] 中可被 nums 数组中所有元素整除的数字个数。