题目链接:279. Perfect Squares
概述
本题目要求将一个给定的数n
拆分为若干个平方数的和,求最小拆分数。
思路
这个题目可以用动态规划来做。
dp[i]代表组成i的最少平方数的个数,这个值最大就是它本身(看作都由1组成)。
而组成这个数的最小值要么就是本身,要么就是前面某一个数+一个平方数(所以看作值加上1)
所以状态转移方程为:dp[i] = min(dp[i - j * j] + 1, dp[i])
(其中 j < sqrt(i))
有转移方程后代码就很好写了。
这个题目还有另外一个解法,是四平方和定理(好吧,我没听过,读者有兴趣可以自己研究下)
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
var numSquares = function(n) { let dp = new Array(n + 1); for(let i = 0; i <= n; i++){ dp[i] = n; } for(let i = 1; i <= n; i++){ let sqrt = Math.floor(Math.sqrt(i)); if(sqrt * sqrt == i){ dp[i] = 1; continue; } dp[i] = n; for(let j = 1; j <= sqrt; j++){ dp[i] = Math.min(dp[i], dp[i - j * j] + 1); } } return dp[n]; };
|
题解合集