leetcode_279 完全平方数

134 阅读1分钟

要求

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

给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。

示例 1:

输入:n = 12
输出:3 
解释:12 = 4 + 4 + 4

示例 2:

输入:n = 13
输出:2
解释:13 = 4 + 9

代码详解

class Solution:
    def numSquares(self, n: int) -> int:
        mapping = {}
        squares = [num*num for num in range(int(pow(n,0.5))+1)]
        for square in squares:
            mapping[square] = 1
        
        for val in range(1,n+1):
            if val not in mapping:
                mapping[val] = float("inf")
                for square in squares:
                    if square < val:
                        mapping[val] = min(mapping[val],mapping[square]+mapping[val-square])
        return mapping[n]

image.png

重点题目

解题思路:

这道题和零钱兑换的思路是一样的,我们先找到比n大一点的平方数,注意这个地方我们的手法,(int(pow(n,0.5))+1)^2,我们将这个平方数以下的所有的平方数都收集起来,然后我们从1,n+1开始遍历,将所有的值都分解为完全平方数的方式,记录最少的方式,一直到n,我们就能分解出来多个数字组合成这个数字的方式,保证了到达这个数的拼接方式是最少的。(不过时间复杂度比较高,需要知道n下面所有的数字最少的方式,较慢)