利用动态规划的思路:
遍历1到n,如果是质数的话,操作次数为数的大小。非质数的操作次数则根据可整除的最大数决定。
version 1:
class Solution(object):
def minSteps(self, n):
"""
:type n: int
:rtype: int
"""
dp = range(n+1)
dp[0],dp[1] = 0, 0
for i in range(2,n+1):
for j in range(2,i)[::-1]:
if i%j == 0:
dp[i] = dp[j] + (i/j)
break
return dp[n]
这样是把1到n的所有操作次数都存到了dp列表里,所以比较慢,时间复杂度应该是nlogn
version 2:
class Solution(object):
def minSteps(self, n):
ans = 0
d = 2
while n > 1:
while n % d == 0:
ans += d
n /= d
d += 1
return ans
官方答案,是考虑最后一个数,并且对于寻找可整除最大数也进行了优化,时间复杂度为O(√N)