Description:
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
.
Solution:
I think this problem has one problem, that it does not tell us the range of n, which may matter how we choose the algorithm.
And for this one, if DP is OK, then it is kind of trivial.
dp[i + square[j] ] = min ( dp[i] + 1, dp[i+square[j]] )
<span style="font-size:18px;">import java.util.Arrays;
public class Solution {
public int numSquares(int n) {
if (n <= 0)
return 0;
int[] dp = new int[n + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
int squares[] = new int[n];
int count = 0;
for (int i = 1; i * i <= n; i++) {
dp[i * i] = 1;
squares[count++] = i * i;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j < count && i + squares[j] <= n; j++)
dp[i + squares[j]] = Math.min(dp[i + squares[j]], dp[i] + 1);
}
System.out.println(n);
return dp[n];
}
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.numSquares(1));
}
}</span>