一、题目内容
二、题目分析
BFS:
public int numSquares(int n) {
//BFS需要使用队列
Queue<Integer> queue=new LinkedList<>();
//判断是否计算过,避免重复计算
Set<Integer> visited=new HashSet<>();
queue.offer(0);
visited.add(0);
//记录完全平方数的个数
int cnt=0;
while(!queue.isEmpty())
{
//加一
cnt++;
int size()=queue.size();
for(int i=0;i<size;i++){
int temp=queue.poll;
for(int j=1;j<=n;j++){
if(temp+j*j>n)
break;
if(temp+j*j==n)
return cnt;
//没有计算过才可以添加进去
if(!visited.contains(temp+j*j)){
queue.offer(temp+j*j);
visited.add(temp+j*j);
}
}
}
}
}
动态规划:
//dp表示和为i的完全平方数的最小数量
int []dp=new int[n+1];
dp[0]=0;
for(int i=1;i<=n;i++)
{
//默认开始时全为1拼接而成的,所以dp[i]=i
dp[i]=i;
for(int j=1;j*j<=i;j++)
//当前的最小数量等于二者最小值
dp[i]=Math.min(dp[i],dp[i-j*j]+1);
}
return dp[n];