Integer Break解题报告

https://leetcode.com/problems/integer-break/

这道题有一个提示:You may check the breaking results of n ranging from 7 to 10 to discover the regularities.
我们来从1到10来分别进行拆分:
正整数从1开始,但是1不能拆分成两个正整数之和,所以不能当输出。
那么2只能拆成1+1,所以乘积也为1。
数字3可以拆分成2+1或1+1+1,显然第一种拆分方法乘积大为2。
数字4拆成2+2,乘积最大,为4。
数字5拆成3+2,乘积最大,为6。
数字6拆成3+3,乘积最大,为9。
数字7拆为3+4,乘积最大,为12。
数字8拆为3+3+2,乘积最大,为18
数字9拆为3+3+3,乘积最大,为27。
数字10拆为3+3+4,乘积最大,为36。
....
那么通过观察上面的规律,我们可以看出从5开始,数字都需要先拆出所有的3,一直拆到剩下一个数为2或者4,因为剩4就不用再拆了,拆成两个2和不拆没有意义,而且4不能拆出一个3剩一个1,这样会比拆成2+2的乘积小。那么这样我们就可以写代码了,先预处理n为2和3的情况,然后先将结果res初始化为1,然后当n大于4开始循环,我们结果自乘3,n自减3,根据之前的分析,当跳出循环时,n只能是2或者4,再乘以res返回即可。

class Solution {
public:
    int integerBreak(int n) {
        if(n==2||n==3) return n-1;
        int res=1;
        while(n>4){
            res*=3;
            n-=3;
        }
        return res*n;
    }
};
也可以考虑动态规划的方法,用一个数组来记录第i个数被拆分之后的最大乘积。则res[i]=max(res[i],res[j]*res[i-j],res[j]*(i-j),res[i-j]*j,j*(i-j))。

class Solution {
public:
    int integerBreak(int n) {
        if(n<2) return 0;
        vector<int> res(n+1,0);
        res[0]=0;
        res[1]=1;
        res[2]=1;
        for(int i=3;i<=n;i++){
            for(int j=1;j<i;j++){
                int t1=max(res[j]*res[i-j],res[j]*(i-j));
                int t2=max(res[i-j]*j,j*(i-j));
                int t3=max(t1,t2);
                res[i]=max(res[i],t3);
            }
        }
        return res.back();
    }
};



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值