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)

​​

猜你喜欢

转载自blog.csdn.net/a529975125/article/details/79696372
今日推荐