完全平方数-力扣

在这里插入图片描述

方法一(动态规划)

用memo记录每一个比n小的数的最小完全平方个数,k记录的是n开平方的整数部分。

class Solution(object):
    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        memo=[0]*(n+1)
        k=1
        for i in range(1,n+1):
            if i==(k+1)**2:
                k+=1
            memo[i]=1+memo[i-k**2]
            for j in range(k-1,-1,-1):
                memo[i]=min(memo[i],1+memo[i-j**2])
        return memo[n]

方法二(四平方和定理)

用到四平方和定理:每个正整数都可以表示为至多四个正整数的平方和。
由定理可知,每个数的表示结果只有“1,2,3,4”。依次判断其可能情况:
(1)ans = 4 ,判断是否满足推论;(在此过程中,以 4 的倍数缩小 n ,并不影响最后结果)
(2)ans = 1 ,判断缩小后的 n 是否为平方数;
(3)ans = 2 ,判断缩小后的 n 是否可以由两个平方数构成;
(4)ans = 3, 以上都不满足,则结果为 3。

class Solution(object):
    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        while n%4==0:
            n/=4
        if n%8==7:
            return 4
        num=int(n**0.5)
        if num*num==n:
            return 1
        for i in range(1,num+1):
            if n-i*i in [k*k for k in range(1,num+1)]:
                return 2
        return 3

合并结果2,3的情况

class Solution(object):
     def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        while n % 4 == 0: 
            n /= 4 
        if n % 8 == 7: 
            return 4 
        a = 0 
        while a**2 <= n: 
            b = int((n - a**2)**0.5) 
            if a**2 + b**2 == n: 
                return (not not a) + (not not b) 
            a += 1 
        return 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值