利用動態規劃的思路:
遍歷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)