leetcode 動態規劃(二)

目錄

279. 完全平方數(待完善)


279. 完全平方數(待完善)

https://leetcode-cn.com/problems/perfect-squares/

給定正整數 n,找到若干個完全平方數(比如 1, 4, 9, 16, ...)使得它們的和等於 n。你需要讓組成和的完全平方數的個數最少。

示例 1:輸入: n = 12,輸出: 3 ,解釋: 12 = 4 + 4 + 4.
示例 2:輸入: n = 13,輸出: 2,解釋: 13 = 4 + 9.

題解

 一:動態規劃, 時間複雜度O(n^2),用dp[i]表示數字i被拆成的最少的完全平方數的個數。

class Solution(object):
    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        dp = [i for i in xrange(n + 1)]

        for i in xrange(2, n + 1):
            for j in xrange(i):
                if j * j == i:
                    dp[i] = 1
                    break
                else:
                    dp[i] = min(dp[i], dp[j] + dp[i - j])
        return dp[-1] 

 二:動態規劃, 時間複雜度O(n\sqrt{n}),用dp[i]表示數字i被拆成的最少的完全平方數的個數,不過優化了一下,我們內層循環不再遍歷i前的所有數字,而是隻遍歷那些完全平方數,因爲只有完全平方數才能減少個數。

class Solution(object):
    def numSquares(self, n):
        #dp[i], 數字i符合題目要求的個
        dp = [i for i in xrange(n + 1)]

        for i in xrange(2, n + 1):
            j = 0
            while j <= sqrt(i):
                target = j * j
                dp[i] = min(dp[i], dp[i - target] + 1)
                j += 1

        return dp[-1]

三:mark一下,官方題解https://leetcode-cn.com/problems/perfect-squares/solution/wan-quan-ping-fang-shu-by-leetcode/,等刷一部分遞歸再來。

 

 

 

 

 

 

 

 

 

 

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