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 1 DP
//https://leetcode.com/discuss/62526/an-easy-understanding-dp-solution-in-java
public static int numSquares(int n) {
int[] dp = new int[n + 1];
dp[0] = 0;
for(int i = 1; i <= n; i++){
int j = 1;
int min = Integer.MAX_VALUE;
while(i - j * j >= 0){
min = Math.min(dp[i - j * j] + 1,min);
j++;
}
dp[i] = min;
}
return dp[n];
}
Java solution O(n^1/2) time and O(1) space
https://leetcode.com/discuss/57020/java-solution-o-n-1-2-time-and-o-1-space
https://en.wikipedia.org/wiki/Jacobi%27s_four-square_theorem
Solution 3 BFS
https://leetcode.com/discuss/58056/summary-of-different-solutions-bfs-static-and-mathematics
//BFS
//https://leetcode.com/discuss/58056/summary-of-different-solutions-bfs-static-and-mathematics
public static int numSquares3(int n) {
List<Integer> squares = new ArrayList<Integer>();
int[] countArray = new int[n + 1];
for(int i = 1; i*i <= n; i++){
squares.add(i * i);
countArray[i *i - 1] = 1;
}
Queue<Integer> q = new LinkedList<Integer>();
for(int i : squares){
q.offer(i);
}
int step = 1;
while(!q.isEmpty()){
step++;
int qSize = q.size();
for(int i = 0; i < qSize; i++){
int t = q.peek();
for(int j : squares){
if(t + j == n){
return step;
}else if((t + j < n) && (countArray[t + j - 1] == 0)){
countArray[t + j - 1] = step;
q.offer(t + j);
}else if(t + j > n){
break;
}
}
q.poll();
}
}
return 0;
}