• leetcode279. 完全平方数


    给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。

    示例 1:

    输入: n = 12
    输出: 3
    解释: 12 = 4 + 4 + 4.
    示例 2:

    输入: n = 13
    输出: 2
    解释: 13 = 4 + 9.

    路径最短的问题 使用BFS最优

    BFS其实是很简单的算法,只需要掌握以下几个套路

    1.BFS算法组成的三要素:队列、入队及出队的结点、已经访问的标记集合

      队列:先入先出的容器

      入队、出队的结点

      已访问标记集合:避免队列插入重复的值

    2.BFS算法组成的格式

      (1)初始化元素

           queue<int>qq;
           vector<int>visited(n+1);
      (2)操作队列---弹出队首节点
           int num=qq.front();
           qq.pop();
    ····(3)操作弹出的节点 —— 根据业务生成子节点(一个或多个):
           for(int i=1;i<=static_cast<int>(sqrt(num));i++)
               int temp=num-i*i;
       (4)判断这些节点 —— 符合业务条件,则return,不符合业务条件,且不在已访问集合,则追加到队尾,并加入已访问集合:
        
               if(temp==0) return step;
               else if(!visited[temp])
               {
                  qq.push(temp);
                  visited[temp]=true;
                }

                    (5)若以上遍历完成仍未return,下面操作返回未找到代码:return -1;

    class Solution{
    public:
        int numSquares(int n)
        {
           int step=0;
           queue<int>qq;
           vector<int>visited(n+1);
           qq.push(n);
           visited[n]=true;
           while(!qq.empty())
           {
               int size_=qq.size();
               step++;
               for(int j=0;j<size_;j++)
               {
                   int num=qq.front();
                   qq.pop();
                   for(int i=1;i<=static_cast<int>(sqrt(num));i++)
                   {
                       int temp=num-i*i;
                       if(temp==0) return step;
                       else if(!visited[temp])
                       {
                           qq.push(temp);
                           visited[temp]=true;
                       }
                   }
                   
               }
               
           }
           return -1;
        }
    };
  • 相关阅读:
    简单背包问题
    拓扑排序
    SPFA--P3905 道路重建
    Floyd--P1119 灾后重建
    Kmp--P3375 【模板】KMP字符串匹配
    练习 后缀数组
    BZOJ1036: [ZJOI2008]树的统计Count(树链剖分)
    BZOJ1503: [NOI2004]郁闷的出纳员(Splay)
    BZOJ2733: [HNOI2012]永无乡(线段树合并)
    BZOJ4196: [Noi2015]软件包管理器(树链剖分)
  • 原文地址:https://www.cnblogs.com/renzmin/p/11914835.html
Copyright © 2020-2023  润新知