今早是闲得无聊,刚好打开了LeeCode,然后就沉迷其中不能自拔。(其实就是一个题,整了很长时间,枯了)
题目描述
给一个2~58的数(为啥是58呢?他就离谱),把他拆成好几个整数的和,要求这几个整数的积最大,返回最大积。
思路
思路是这样的,如果确定了是2个数字,按照以前的知识(应该是小学吧),周长确定的矩形面积最大,就是正方形了,也就是两个数相差最小才能保证积最大。
那如果是对于多个数字呢?
还记得这个吗,均值不等式(反正我忘了,是百度百科的截图)
乘积的最大值就是在所有数都一样的时候,因为是整数,所以能稍微差了一点,并非真正意义上的平均值。
所以我是这样想的,for循环i从2到n,对于每一个i都求一个整数平均值,求一个余数,按余数的个数分配给一部分的平均数(如m=10,i=3时,平均数为3,余数为1,因为只有一个,所以将最后一个3加一变成4,即3 3 4)这样得到的乘积就是对应i下的最大值。对比每一个i,得到最大并返回。
代码
int integerBreak(int n){
int max=0;for(int i=2;i<=n;i++)//循环每一种划分{
int integer = n/i;int remain = n%i; int answer=1;for(int j=0;j<i-remain;j++)answer *= integer;//没有分配到余数的部分for(int j=0;j<remain;j++)answer *= (integer+1);//分配了余数的部分if(answer>max)max=answer;}return max;
}
这个是leecode的回复。(那个0ms应该是卡bug了,反正是没有超时的)
一些其他的想法
刚才看到了一份百度文档,说如果平均数接近于e(2.7那个),乘积会更大。
还是刚才是参数,f(x)=(m/x)x,也就是让这个函数最大,求导喽。
这玩意怎么求啊,枯了,但是想到有一个指数,然后因为是正数,取e为底的对数!
g(x)=x*(ln m - ln x) -> g’(x)=ln m - ln x - 1 = 0 -> x = m / e
所以呢,分母是e但同时别忘了也是x,所以要使x->e,只有两个数了,2和3
答案出现了,那就是将数字拆分成2和3(之前的10有人可能会怀疑为什么有4,因为把4拆成两个2是一样的啊)
再分析一下,是先2还是先3。很简单的例子,取6,如果是2应该为8(222),而如果是3应该为9(3*3)
还有一种方式是3更趋近于e。
验证:
8: 3 3 2 = 18 (正确)
补充:见到有一个dl直接是利用例举(1~6)的方式也得到了2和3的结论,不过个人感觉数学证明可能更加有道理一点吧。。。