[Leetcode] LCP 14. 切分数组
题目链接:https://leetcode-cn.com/problems/qie-fen-shu-zu/
分析:
是一道数学题。
原始的想法是,访问到第i个数字,保存i之前符合要求的index,然后使用dp,这样会超时。
换个思路第i位的结果来源于两个。
- 一是独自构成一个子数组
- 二是分解成质因数x,y,z等等。找到最小的那个再加1
于是重点是如何分解质因数。使用下面的方法得到每个数字的最小质因数。得到这个表后。每次来一个数,就使用这个表迭代整除就可以得到全部的质因数。
Python
n = 1000001
minPrime = [1]*n
for i in range(2,n):
for j in range(i, n, i):
if minPrime[j] == 1:
minPrime[j] = i
class Solution:
def splitArray(self, nums: List[int]) -> int:
# def gcd(x, y) -> int:a
# if not x:
# return y
# else:
# return gcd(y%x, x)
prev, cur = 0, 0
dic = {}
# for i in minPrime:
# dic[i] = 100000
for i in range(len(nums)):
cur = prev + 1
temp = nums[i]
while temp!=1:
if minPrime[temp] in dic.keys():
cur = min(cur, dic[minPrime[temp]]+1)
dic[minPrime[temp]] = min(dic[minPrime[temp]], prev)
else:
dic[minPrime[temp]] = prev
temp //= minPrime[temp]
prev = cur
return cur