完全平方数

最近再力扣上刷了一道挺不错的题目,虽然现在看来比较简单,但是这道题真的让我这个初入算法区的萌新对队列中的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;
    }
};

好了,以上就是我们全部内容了,如果大家有更好的解法,欢迎分享。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值