给你一个整数 n
,返回 和为 n
的完全平方数的最少数量 。
完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1
、4
、9
和 16
都是完全平方数,而 3
和 11
不是。
示例 1:
输入:n = 12
输出:3
解释:12 = 4 + 4 + 4
示例 2:
输入:n = 13
输出:2
解释:13 = 4 + 9
提示:
1 <= n <= 104
思路:动态规划
1、设置数组dp[i]记录i位置满足题目的最少数量,初始值可以先赋为i
2、计算dp[i]时 ,例如12,可以找dp[12-1²] + 1 = dp[11] +1即12可以是11的最少数量再加上一个1;当然,也可以是dp[12-2²] + 1 = dp[8] +1即12也可以是8的最少数量加上一个2的平方;当然,也可以是dp[12-3²] + 1 = dp[3] +1即12也可以是3的最少数量加上一个3的平方;
...
3、因此,在计算每个i位置的最少数量时,可以通过减1 2 3 ... sqrt(i) 的平方 找到前面位置的最少数量再 + 1 找到最小值就是dp[i]的值
4、最终返回dp[n]即可
var numSquares = function(n) {
let dp = [0]
for(let i = 1;i < n + 1;i++){
dp[i] = i
for(let j = 1;j * j <= i;j++){
dp[i] = Math.min(dp[i],dp[i - j * j] + 1)
}
}
return dp[n]
};
时间复杂度:O(n * sqrt(n))
空间复杂度:O(n)