给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。
示例1:
输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.
示例2:
输入: n = 13
输出: 2
解释: 13 = 4 + 9.
代码如下:
class Solution {
public:
vector<int> getsq(int n)//获取小于n的完全平方数
{
vector<int> s;
for(int i=1;i*i<=n;i++)
{
s.push_back(i*i);//vector模板中的函数push_back():在 vector 容器尾部添加一个元素
}
return s;
}
int numSquares(int n) {
vector<int> squre = getsq(n);
int sq_length=squre.size();
queue<int> q;
q.push(0);
int step=0;
while(!q.empty())//BFS框架
{
step++;
int size = q.size();
for(int j=0;j<size;j++)
{
int value=q.front();
q.pop();
for(int i=0;i<sq_length;i++)
{
int sum = value+squre[i];
if(sum==n)
return step;
if(sum>n)
continue;
q.push(sum);
}
}
}
return -1;
}
};
解析:
参考力扣题解中的一篇,0作为根节点,终点是n,每次的跨度是小于n的完全平方数。
附图: