题目描述
给定一个正整数 n ,找到最少数量的平方数(例如1, 4, 9, 16)使这些平方数的和等于 n 。返回最少的数量。
示例
Input: n = 12
Output: 3
解释: 12 = 4 + 4 + 4.
Input: n = 13
Output: 2
解释: 13 = 4 + 9.
思路
将整个过程看做一张图,每个数字都是一个点,两个数字之间差距为平方数时有一条单向边。使用 BFS 来求从 0 到 n 的最短路。
代码
class Solution {
public:
int numSquares(int n) {
vector<int>dis(n+1,INT_MAX);//将数组初始化无穷大
dis[0]=0;
queue<int>q;
q.push(0);
while(!q.empty())
{
int s=q.front();
if(s==n)
break;
for(int i=1;s+i*i<=n;i++)
{
if(dis[s+i*i]>dis[s])
{
dis[s+i*i]=dis[s]+1;
q.push(s+i*i);
}
}
q.pop();
}
return dis[n];
}
};