📌  相关文章
📜  将数组拆分为最小数量的子数组,其第一个和最后一个元素的 GCD 超过 1(1)

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

将数组拆分为最小数量的子数组,其第一个和最后一个元素的 GCD 超过 1

介绍

在本题中,我们需要将给定的数组拆分成最小数量的子数组,使得每个子数组的第一个和最后一个元素的GCD(最大公约数)大于1。

解法

我们可以从左往右遍历数组,每当发现当前元素和上一个元素的GCD大于1时,就将它们拆分成一个子数组。由于每个子数组的第一个和最后一个元素的GCD都大于1,所以它们满足题目要求。 具体实现时,我们可以使用一个变量 gcd 来记录当前子数组中所有元素的GCD。如果当前元素和 gcd 的GCD大于1,则将当前元素添加到新的子数组中,并更新 gcd 为当前子数组所有元素的GCD。如果当前元素和 gcd 的GCD等于1,则将当前元素添加到当前子数组中,并继续遍历下一个元素。遍历完成后,我们就可以得到最小数量的子数组了。

代码
def split_array(nums: List[int]) -> int:
    count = 1
    gcd = nums[0]
    for i in range(1, len(nums)):
        gcd = math.gcd(gcd, nums[i])
        if gcd == 1:
            count += 1
            gcd = nums[i]
    return count
复杂度分析
  • 时间复杂度:$O(n \log n)$,其中 $n$ 是数组的长度。每次调用 math.gcd(a, b) 时间复杂度为 $O(\log \min(a, b))$,因为数组中的所有数都会被遍历一遍,所以总时间复杂度为 $O(n \log n)$。
  • 空间复杂度:$O(1)$。除了存储中间结果和返回结果外,我们并没有使用额外的空间。