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