279.Perfect Squares
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, …) which sum to n.
For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.
方法
动态规划题型
一开始使用暴力递归,过了46个样例就不行了,只能使用动态规划。 状态转换方程为
Math.min(dp[i],dp[i-j*j] + 1) {i - j*j >= 0}
解释: dp[i]表示对于给定的i需要多少个完美平方数。
如果一个数x可以表示为一个任意数a加上一个平方数bxb,也就是x=a + b * b,那么能组成这个数x最少的平方数个数,就是能组成a最少的平方数个数加上1(因为b*b已经是平方数了)。
public class Solution {
public int numSquares(int n) {
int[] dp = new int[n + 1];
Arrays.fill(dp,Integer.MAX_VALUE);
dp[0] = 0;
for(int i = 1; i <= n; i++){
for(int j = 1; i - j*j >= 0; j++){
dp[i] = Math.min(dp[i],dp[i-j*j] + 1);
}
}
return dp[n];
}
}