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/,等刷一部分递归再来。

 

 

 

 

 

 

 

 

 

 

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