LeeCode——343 整数拆分

今早是闲得无聊,刚好打开了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的结论,不过个人感觉数学证明可能更加有道理一点吧。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值