原题题目
代码实现(首刷自解)效率较低
int numSquares(int n){
int dp[11000] = {0},count = 2,temp = 4,j,i,tempcount,arr[101];
arr[0] = 0,arr[1] = 1;
dp[0] = 0,dp[1] = 1,dp[2] = 2;
for(i=3;i<=n;i++)
{
dp[i] = INT_MAX;
if(i == temp)
{
dp[i] = 1;
arr[count++] = temp;
temp = count*count;
}
else
{
for(j=1;j<=count-1;j++)
{
if(dp[arr[j]] + dp[i-arr[j]] < dp[i])
dp[i] = dp[arr[j]] + dp[i-arr[j]];
}
}
}
return dp[n];
}
代码实现(优化代码)
int min(int a, int b)
{
if(a > b)
return b;
return a;
}
int numSquares(int n){
int dp[n+1];
for(int i = 0; i <= n; i++)
dp[i] = i;
for(int i = 1; i <= n; i++)
for(int j = 1; i-j*j >= 0; j++)
dp[i] = min(dp[i],dp[i-j*j]+1);
return dp[n];
}
代码实现(二刷DAY 88 自解)
class Solution {
public:
int numSquares(int n) {
int count = 1,temp = 1;
vector<int> dp(n+1,0);
vector<int> pownums;
for(int i = 1;i<=n;++i)
{
dp[i] = i;
if(temp == i)
{
dp[i] = 1;
pownums.push_back(temp);
temp = pow(++count,2);
continue;
}
for(const auto& num:pownums) dp[i] = min(dp[i],dp[i-num]+1);
}
return dp[n];
}
};
代码实现(三刷自解 DAY 150 C++)
class Solution {
public:
int numSquares(int n) {
int count = 1,tmp = sqrt(n);
vector<int> dp(n+1,INT_MAX);
dp[0] = 0;
while(count != tmp+1)
{
dp[pow(count,2)] = 1;
++count;
}
count = 1;
for(int i=1;i<=n;++i)
{
if(dp[i] == 1) ++count;
for(int j=count-1;j>=1;--j)
dp[i] = min(dp[i],dp[i-j*j]+1);
}
return dp[n];
}
};
代码实现(四刷优化部分看解 每次选取平方数 DAY 245 C++)
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,0),cnt;
dp[1] = 1;
auto pow_num = 2,next_num = 4;
for(int i = 2;i <= n;++i)
{
auto num = 10000;
for(int j = 1;j*j <= i;++j)
num = min(num,1 + dp[i - j*j]);
dp[i] = num;
}
return dp[n];
}
};