最近再力扣上刷了一道挺不错的题目,虽然现在看来比较简单,但是这道题真的让我这个初入算法区的萌新对队列中的BFS有了更加全面的理解。
这道题是完全平方数,答案是套用评论区大佬的,原题描述是:
这道题的意思很好懂,就是求一个数n,它最少能由多少个平方数相加得来。
我们大体的思路可以可以这样描述:
我们拿到数n,首先将平方数的大小限定在小于n的这个区间内;
然后我们令各个平方数为i,对n进行逐个递减,这样我们就能得到 进行一次运算后所得到的所有结果,
我们在将这些结果全部存入到队列q当中,在对里面的所有的元素进行相同的操作,
以此类推,我们就可以得到所有情况。
以上就是我们大致的思路,那么在遍历的中途,我们肯定也是要判断所得出的结果究竟是否符合要求,这些条件我们就同样放在相应的if语句中就可以了
那么下面就是用c++写的代码:
class Solution {
public:
struct s{
int root;
int step;
}s1,s2;
int numSquares(int n) {
s1.root=n;
s1.step=0;
queue<s>q;
q.push(s1);
while(!q.empty())
{
s1=q.front();//取得队列的首元素---从而将各个树枝都遍历一遍
q.pop();//删除首元素
s1.step++;//这里的step,如果没有进行到下一轮,其将会不断被刷新。
for(int i=1;i*i<=n;i++)//大于n的平方数不考虑
{
s2.root=s1.root-i*i;//相减可以方便遍历所有元素
s2.step=s1.step;
q.push(s2);
if(s2.root==0)
{
return s2.step;
}
}
}
return 0;
}
};
好了,以上就是我们全部内容了,如果大家有更好的解法,欢迎分享。