1.数据数量少,单个数据大小不限
int MixFuntion(int n)
{
int i = sqrt(n);
if (i*i == n)
return 1;
int minLen = INT_MAX;
for(;i*i >= n/2;i--)
{
int len = 1 + MinExpressionInteger(n - i*i);
if (minLen > len)
minLen = len;
}
return minLen;
}先计算其中最大的一个平方数,如果等于i就返回1。
之后用递归的方式算出最大平方数为k*k时的len,在与最大平方数为其他值的情况进行比较,得出minlen
i
┌───┬──────┬───────────────┐
│ │ │ k*k │
└───┴──────┴───────────────┘
2数据数量大,单个数据小
const int MAX = 100000;
int MinNum[MAX+1] = {0};
int MixFuntion(int n ,int &mixLen)
{
if(n > MAX)
return 0;
int i = sqrt(n);
if(i*i == n)
{
MinNum[n] = 1;
return 1;
}
int flag = 0;
for(;i*i >= n/2;i--)
{
int num = n-i*i;
if(!MinNum[num])
MixFuntion(num);
if(!MinNum[flag] || MinNum[flag]>MinNum[num])
flag = num;
}
MinNum[n] = MinNum[flag] + 1;
mixLen = MinNum[n];
return 1;
}方法是一样的,只不过拿了个数组记了一下。。。
本文介绍了两种场景下的算法实现:当数据量较小时,采用递归方式寻找最小平方数和;当数据量较大时,则利用数组记录已计算结果以提高效率。通过计算找出能够构成目标整数的最少完全平方数的数量。
843

被折叠的 条评论
为什么被折叠?



