思路:BFS,每一次是原数字减去了一个平方数,直到出现第一个0,此时走过的层数就是最小数量。
比如传入的数是7,那应该就是
如果传入16,那应该就是16->15,12,7,0 答案就是层数,也就是1.
class Solution {
public int numSquares(int n) {
Queue<Integer> queue=new LinkedList<>();
HashSet<Integer> visited=new HashSet<>();
queue.offer(n);
visited.add(n);
int level=0;
while(!queue.isEmpty()){
level++;
int len=queue.size();
for(int i=0;i<len;i++){
int cur=queue.poll();
for(int j=1;j*j<=cur;j++){
int tmp=cur-j*j;
if(tmp==0)
return level;
if(!visited.contains(tmp))
queue.offer(tmp);
visited.add(tmp);
}
}
}
return level;
}
}
动态规划:因为temp每次计算的都是组成(i - j * j) 的最小数组,每次都差一个j*j这个元素要加上才能凑成和为i
class Solution {
public int numSquares(int n) {
int[] f = new int[n + 1];
f[0] = 0;
for(int i = 1; i <= n; i++){
int temp = Integer.MAX_VALUE;
for(int j = 1; j * j <= i; j++){
temp = Math.min(temp, f[i -j * j]);
}
f[i] = temp + 1;
}
return f[n];
}
}