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;
}
};