167-279. 完全平方数

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。(第一个我写的)
import math

class Solution(object):
    def numSquares1(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 2:
            return 1
        dp = [0 for _ in range(n + 1)]
        dp[0] = 0
        dp[1] = 1
        for i in range(2, n + 1):
            squ = math.floor(math.sqrt(i))
            squ_num2 = 1 if math.sqrt(i).is_integer() else float("inf")
            if squ_num2 == 1:
                dp[i] = 1
                continue

            min_squ_num = float("inf")
            for j in range(squ):
                squ_num = dp[(squ - j) ** 2] + dp[i - (squ - j) ** 2]
                min_squ_num = min(min_squ_num, squ_num)
                if min_squ_num == 2:
                    break
            dp[i] = min(min_squ_num, squ_num2)
        return dp[n]

    def is_square(self, n):
        sq = int(math.sqrt(n))
        return sq*sq == n

    def numSquares(self, n):
        """
        :type n: int
        :rtype: int
        """
        # 为什么n % 4 = n & 3,其实n % 8 = n & 7 ,n % 16 = n & 15 你发现什么了么?
        while n & 3 == 0:
            n /= 4
        if n & 7 == 7:
            return 4
        if self.is_square(n):
            return 1
        for i in range(1, int(math.sqrt(n))+1):
            if self.is_square(n-i*i):
                return 2
        return 3
原文地址:https://www.cnblogs.com/liuzhanghao/p/14384449.html