📌  相关文章
📜  K长度子数组中元素的最大不同素因数(1)

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

K长度子数组中元素的最大不同素因数

素因数是指质数因子,也就是一个数分解质因数后的质数因子。不同于最大质因数,最大不同素因数是指一个集合中不同数的最大素因数。

问题描述

给定一个长度为 $N$ 的正整数数组 $arr$,以及一个正整数 $K$。对于每个长度为 $K$ 的子数组 $subarr$,找到 $subarr$ 中不同元素的最大素因数。如果 $subarr$ 中的所有元素都相同,则将该元素的最大素因数视为 $1$。将所有的最大素因数存储在一个新数组 $ans$ 中,并返回 $ans$。

示例

输入:

arr = [10, 5, 7, 9, 2, 8, 4, 11]
K = 3

输出:

ans = [5, 7, 3, 1, 2, 2, 2]

解释:

  • subarr=[10,5,7] 的不同元素为 10, 5, 7,它们的最大素因数分别为 5, 5, 7,因此 max(5, 5, 7) = 7,所以 ans[0] = 7

  • subarr=[5,7,9] 的不同元素为 5, 7, 9,它们的最大素因数分别为 5, 7, 3,因此 max(5, 7, 3) = 7,所以 ans[1] = 7

  • ...

解决方案

我们可以依次遍历每个长度为 $K$ 的子数组,并求出它们的不同元素的最大素因数。具体实现可以使用 Python 的 set 数据结构,它可以快速地去除重复元素。对于一个子数组,我们可以使用一个 set 结构保存其中的不同元素,并使用一个循环计算这些元素的最大素因数。

下面是 Python 的实现。

def max_prime_factor(n):
    """
    返回 n 的最大质因子
    """
    i = 2
    while i * i <= n:
        while n % i == 0:
            n = n // i
            if n == 1:
                return i
        i += 1
    if n > 1:
        return n
    return 1


def solve(arr, K):
    ans = []
    for i in range(len(arr) - K + 1):
        subarr = arr[i:i+K]
        primes = set()
        for j in subarr:
            primes.add(max_prime_factor(j))
        ans.append(max(primes))
    return ans
复杂度分析
  • 时间复杂度: $O(NK \sqrt{M})$,其中 $M$ 表示数组中最大的元素。考虑到 $M$ 的数量级不会非常大,因此可以认为算法的时间复杂度为 $O(NK)$。
  • 空间复杂度: $O(N)$,存储了新数组 $ans$。
参考文献