您的位置:首页 > Web前端

279. Perfect Squares

2016-07-17 17:28 183 查看
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
.

Credits:

Special thanks to
@jianchao.li.fighter for adding this problem and creating all test cases.

Subscribe to see which companies asked this question

class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,INT_MAX);
vector<int> num;
if(n<4) return n;
dp[1]=1;
int m=1;
for(int i=1;m<=n;)
{
if(m<0)
break;
dp[m]=1;
num.push_back(m);
i++;
m=i*i;

}
for(int  i=1;i<=n;++i)
{
for(int j=0;j<num.size();++j)
if(dp[i]!=INT_MAX&&(i+num[j]<=n))
dp[i+num[j]]=min(dp[num[j]+i],1+dp[i]);
}
// cout<<dp
;
return dp
==INT_MAX?n:dp
;
}
};

优化后的做法,代码:

class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,INT_MAX);
for(int i=0,j=0;j<=n;j=i*i){
dp[j]=1;
++i;
}
for(int i=2;i<=n;++i){
if(dp[i]!=1){
for(int j=1,k=1;k<i;k=j*j){
dp[i]=min(dp[i],1+dp[i-k]);
j++;
}
}
}
return dp
;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: