279. Perfect Squares

来源:互联网 发布:淘宝代销退货流程 编辑:程序博客网 时间:2024/05/01 15:09

279. Perfect Squares

Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 16, ...) which sum to n.

For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9.

转载于点击打开链接

1. 每个数n均可以写成n=i*i+(n-i*i);故x[n]=1+x[n-i*i]

 int numSquares(int n) {       vector<int> x(n+1,n);       x[0]=0;       for(int i=1;i<=n;i++)       for(int j=1;j*j<=i;j++)       x[i]=min(x[i],1+x[i-j*j]);       return x[n];    }

2.加了static,对于大量测试用例的重复计算,可以加快速度点击打开链接

 int numSquares(int n) {       static vector<int> x({0});       while(x.size()<=n)       {           int m=x.size();           int tx=m;           for(int i=1;i*i<=m;i++)           {               tx=min(tx,x[m-i*i]+1);           }           x.push_back(tx);       }       return x[n];    }

3.BFS,假设n,则把1,2,...,n,看成一个个节点,它们组成一个图,起点分别为1*1,2*2,..,i*I,(i*i<n),则可以通过这样的边将点链接起来。如果n-j=i*i,则它们是相邻的边。因此,可以通过广度优先搜索解决。

class Solution {public:    int numSquares(int n) {        if(n<=0) return 0;        vector<int> x(n,0);        vector<int> perfectsq;        int i,j;        queue<int> q;        for(i=1;i*i<=n;i++)        {          x[i*i-1]=1;          perfectsq.push_back(i*i);          q.push(i*i);        }        if(perfectsq.back()==n)        return 1;        int curlev=1;        while(!q.empty())        {            curlev++;            int qsize=q.size();            for(i=0;i<qsize;i++)            {                int tmp=q.front();                for(auto j:perfectsq)               {                if(tmp+j==n)                return curlev;                else if(tmp+j<n&&x[tmp+j-1]==0)                {                    x[tmp+j-1]=curlev;                    q.push(tmp+j);                }else if(tmp+j>n)                break;               }               q.pop();            }                    }              return 0;    }};



0 0