leetcode 279. 完全平方数(python动态规划)

动态转移方程:动态转移方程为:dp[i] = MIN(dp[i], dp[i - j * j] + 1),i表示当前数字,jj表示平方数
dp[i - j * j] + 1解释如下:
假设m满足最少完全平方个数,m = f(n)
n满足 ∑(A[i] * A[i]) = n
假设k满足最小值m的时候的值,则令 d + k * k = n, d >= k
可得 f(d) + f(k * k) = f(n), f(k * k)只有k^2一个数,
又有d = n - k * k
综上可得 f(n - k * k) + 1 = f(n)
参考链接:https://leetcode-cn.com/problems/perfect-squares/solution/hua-jie-suan-fa-279-wan-quan-ping-fang-shu-by-guan/
算法时间复杂度: O(n
sqrt(n)); 空间复杂度:O(n)

class Solution(object):
    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        """
        动态转移方程解释:
        假设m满足最少完全平方个数,m = f(n)
        n满足 ∑(A[i] * A[i]) = n
        假设k满足最小值m的时候的值,则令 d + k * k = n, d >= k
        可得 f(d) + f(k * k) = f(n), f(k * k)只有k^2一个数,
        又有d = n - k * k
        综上可得 f(n - k * k) + 1 = f(n)
        """
        dp = [0] * (n + 1)
        for i in range(1, n + 1):
            dp[i] = i #最坏情况是每次都加1,即为,1^2的和
            for j in range(1, int(i ** 0.5) + 1):
                dp[i] = min(dp[i], dp[i - j * j] + 1)
        return dp[n]

x = Solution()
x.numSquares(12)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值