📅  最后修改于: 2023-12-03 15:09:37.172000             🧑  作者: Mango
在本题中,我们需要将给定的数组拆分成最小数量的子数组,使得每个子数组的第一个和最后一个元素的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
math.gcd(a, b)
时间复杂度为 $O(\log \min(a, b))$,因为数组中的所有数都会被遍历一遍,所以总时间复杂度为 $O(n \log n)$。