题目描述
AC代码
第一种做法:DP
f [ i ] f[i] f[i]表示平方数组成 i i i所需要的最少数量。
class Solution {
public int numSquares(int n) {
int f[]=new int[n+1];
for(int i=1;i<=n;i++)
f[i]=n;
f[0]=0;
for(int i=1;i<=n;i++)
for(int j=1;j*j<=i;j++)
f[i]=Math.min(f[i],f[i-j*j]+1);
return f[n];
}
}
第二种做法:BFS+DP
class Solution {
public int numSquares(int n) {
int f[]=new int[n+1];
for(int i=1;i<=n;i++)
f[i]=n;
f[0]=0;
Queue<Integer> q=new LinkedList<>();
q.add(0);
while(!q.isEmpty()){
int cur=q.peek();
q.poll();
if(cur==n)
break;
for(int i=1;cur+i*i<=n;i++)
if(f[cur+i*i]>f[cur]+1){
f[cur+i*i]=f[cur]+1;
q.add(cur+i*i);
}
}
return f[n];
}
}