第一种方法
是采用自上而下得递归方案,所以采用了递归,时间开销比较大,所以在领扣中时间超时了
int max(int a, int b)
{
return a>=b?a:b;
}
int max3(int a,int b,int c)
{
return(max(a,max(b,c)));
}
int integerBreak2(int n,int*a){//递归函数
int res = 1;
if(a[n]!=0)
{
return a[n];
}
for(int i =1;i<=n-1;i++)
{
res = max3(res,i*(n-i),i*integerBreak2(n-i,a));//一个已知的最大值,一个分成两个
//数,一个是n-i的最大值和i,此处是核心,重点标注
}
return res;
}
int integerBreak(int n)
{
//一个数分割,不管分成几份,那必须可以分成1+... 2+.... 3+.... 4+..... n-1+...
//所以呢,n最大乘积可以在max{1*integerbreak(n-1),2*intergerbreak(n-2)....}
int* memo=(int *)calloc((n+1),sizeof(int));
return(integerBreak2(n,memo));
}
第二种方法是采用自下而上 ,这也是比较常见得一种方法了
int max(int a, int b)
{
return a>=b?a:b;
}
int max3(int a,int b,int c)
{
return(max(a,max(b,c)));
}
int integerBreak(int n){
int* memo = (int *)calloc(n+1,sizeof(int));
memo[1]=1;
for(int i =2;i<=n;i++)
{
for(int j =1;j<i;j++)
{
memo[i]=max3(memo[i],j*memo[i-j],j*(i-j));
}}
return(memo[n]);
}
执行用时 :
0 ms
, 在所有 C 提交中击败了
100.00%
的用户
内存消耗 :
7 MB
, 在所有 C 提交中击败了
13.48%
的用户