Leetcode 279:完全平方数

98 篇文章 1 订阅
83 篇文章 1 订阅

在这里插入图片描述
思路
四平方定理

Lagrange 四平方定理: 任何一个正整数都可以表示成不超过四个整数的平方之和。

四平方定理的重要推论:

满足四数平方和定理的数n(这里要满足由四个数构成,小于四个不行),必定满足 n=4a(8b+7) n = 4a(8b + 7)

根据这个重要的推论,我们可以非常迅速的写出这样的代码:

我们首先将输入的n迅速缩小。然后我们再判断,这个缩小后的数是否可以通过两个平方数的和或一个平方数组成,不能的话我们返回3,能的话我们返回平方数的个数。

import math
class Solution(object):
    def numSquares(self, n):
        # dp = [0]
        # for i in range(1, n+1):
        #     dp.append(min(dp[-j*j] for j in range(1, 1 + int(i**0.5))) + 1)
        # return dp[-1]
        
        
        #首先根据公式缩小n
        while n % 4 == 0:
            n /= 4
        #满足公式,则返回4
        if n % 8 == 7:
            return 4
        #再判断缩小后的数是否可以由一个数的平和或者两个数的平方的和组成
        a = 0
        while a**2 <= n:
            b = int((n - a**2)**0.5)
            #如果可以,返回平方的个数
            if n == a**2 + b**2:
                return (not not a) + (not not b)
            a += 1
        #如果不行,则返回3
        return 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值