这题可以使用动态规划来解决,首先求出小于等于n的所有平方数,以12为例,平方数是1,4,9。定义coins为完全平方数数组,定义dp[i]组成i需要的最少完全平方数,那么 。
class Solution {
public int numSquares(int n) {
//找出所有小于等于n的完全平方数
List<Integer> coins = new ArrayList<>();
for(int i = 1; i <= n; i++) {
if(i * i <= n) {
coins.add(i * i);
}
}
//定义dp[i]是购成i的最小完全平方数个数,很明显dp[n] < n + 1
int[] dp = new int[n + 1];
Arrays.fill(dp, n + 1);
dp[0] = 0;
for(int i = 1; i <= n; i++) {
for(int j = 0; j < coins.size(); j++) {
if(coins.get(j) <= i) {
dp[i] = Math.min(dp[i - coins.get(j)] + 1, dp[i]);
}
}
}
return dp[n];
}
}