时间复杂度:O(n²),空间复杂度:O(n)
解题思路
动态规划,令dp[i]表示和为i的完全平方数最少个数。
从1开始枚举各个数的平方,然后根据i与该平方的差值找到dp[i-j²]的最少个数。最后dp[i]就是最少的个数再加1。
为什么要再加1呢?因为我们枚举了一种情况呀!
边界条件为dp[0]=0,原因是i为0不可能用完全平方数组合出来。
AC代码
func numSquares(n int) int {
dp:=make([]int,n+1)
for i:=1;i<=n;i++{
m:=math.MaxInt32
for j:=1;j*j<=i;j++{
m=min(m,dp[i-j*j])
}
dp[i]=m+1
}
return dp[n]
}
func min(a,b int)int{
if a<b{
return a
}
return b
}
感悟
自认为会了动态规划,做起来又懵逼了。再加上说得不太清楚的官方题解,还是看代码更有效果。