[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
posted @ 2020-10-13 23:36  我的小叮当  阅读(164)  评论(0编辑  收藏  举报