【Leetcode】650. 2 Keys Keyboard

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

​​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章