leetcode(279). Perfect Squares

problem

Given a positive integer n, find the least number of perfect square
numbers (for example, 1, 4, 9, 16, …) which sum to n.

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n =
13, return 2 because 13 = 4 + 9.

solution

这个问题可以使用四平方和定理来求解,但是这个算法比较特殊、trick,所以这里主要介绍一下dp解法。

这个问题不需要自己定义子问题了,所以只关心递推方程即可, dp[i]=min(dp[ijj]+1),for jj<=i ,这里的一个收获就是这个递推方程,我之前使用的是 dp[i]=min(dp[ij]+dp[j]),for j<=i/2 ,所以在dp中只要能正确的将i降下来(因为所有数一定会分解成j*j + x,所以不会漏掉任何可能的情况),所需要的代价越小越好。前者用了O(log i),而后者用了O(i)的时间。

class Solution(object):
    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        m = [float('inf')]*(n+1)

        i = 1
        while i*i <= n:
            m[i*i] = 1
            i += 1

        for i in range(1, n+1):
            if m[i] == float('inf'):
                j = 1
                while j*j <= i:
                    m[i] = min(m[i], m[j*j]+m[i-j*j])
                    j +=1

        return m[n]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值