给定一个整数数组 nums ,小李想将 nums 切割成若干个非空子数组,使得每个子数组最左边的数和最右边的数的最大公约数大于 1 。为了减少他的工作量,请求出最少可以切成多少个子数组。
示例 1:
输入:nums = [2,3,3,2,3,3]
输出:2
解释:最优切割为 [2,3,3,2] 和 [3,3] 。第一个子数组头尾数字的最大公约数为 2 ,第二个子数组头尾数字的最大公约数为 3 。
示例 2:
输入:nums = [2,3,5,7]
输出:4
解释:只有一种可行的切割:[2], [3], [5], [7]
限制:
1 <= nums.length <= 10^5
2 <= nums[i] <= 10^6
本题最朴素的思想就是对每个数把它拆成质数之积,然后进行dp。当我们遍历到数组元素nums[i]时,我们把nums[i]拆成一系列质数,p是其中一个质数。f[p]表示到当前元素质数p的最小分组数,则有f[p] = min(f[p],minx + 1),其中minx 是上一个元素nums[i-1]拆出质数中所有f[p]中最小的一个。这样这道题就完成了,只需求到最后一个后把它的所有f[p]中最小的一个(也就是下一个的minx)取出即为答案。