给定正平头 n,找到几何个实足平方数(比方 1, 4, 9, 16, …)使得它们的和即是 n

给定正平头 n,找到几何个实足平方数(比方 1, 4, 9, 16, …)使得它们的和即是 n

给定正平头 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

思绪:

这是一起动静筹备的题,每一个正平头i都不妨由j ∗ j j*jj∗j和i − j ∗ j i-j*ji−j∗j构成,诉求正平头i的实足平方数的最少量量d p [ i ] dp[i]dp[i],则不妨经过求i − j ∗ j i-j*ji−j∗j的实足平方数的最小数目d p [ i − j ∗ j ] dp[i-j*j]dp[i−j∗j],动静传播因变量为:

d p [ i ] = m i n ( d p [ i ] , d p [ i − j ∗ j ] + 1 ) dp[i] = min(dp[i],dp[i-j*j]+1)

dp[i]=min(dp[i],dp[i−j∗j]+1)

class Solution:

def numSquares(self, n: int) -> int:

dp = [0]*(n+1)

for i in range(1, n+1):

dp[i] = i # 最差的情景即是十足由1构成,数目为i

j = 1

while j*j <= i:

dp[i] = min(dp[i-j*j] + 1, dp[i])

j += 1

return dp[-1]

分享到 :

Leave a Reply

Your email address will not be published. Required fields are marked *