343. Integer Break

题目: Integer Break

原题链接:https://leetcode.com/problems/integer-break/
Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.
For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).
Note: You may assume that n is not less than 2 and not larger than 58.
给出一个正整数(2到58之间,包括边界),把它拆分成若干正整数相加的和,给出这些正整数乘积最大的拆分情况(输出乘积)。

不妨把n从2到10的最佳拆分情况都列出来:

n最佳拆分情况乘积
21 + 11
31 + 22
42 + 24
52 + 36
63 + 39
72 + 2 + 312
82 + 3 + 318
93 + 3 + 327
102 + 2 + 3 + 336

其中2和3比较特殊,这两个都是需要拆出一个1来的,剩下的就比较有意思了:
所有的最大乘积中乘数不是2就是3,所以这个给我们一个启示,最好的拆分结果中的元素必定只有2和3,
当然,题目的例子对10的拆分是3 + 3 + 4,但是4本身就是可以拆成2 + 2的,这一点其实是一样的,至于只有2和3那也是显而易见的,首先,从4开始的所有数都是完全可以用2和3来组成的,并且用2和3这些随便组合起来的数的乘积一定比原来的数要大,比如5,拆成 2 + 3之后乘积是6,7能拆成 2 + 2 + 3等,随着数字的增大,这个差距只会越来越大,所以结果中只含有2和3这个结论一定是正确的,接下来的问题就是,如何确定2和3的数目呢?毕竟只有2和3的话也有很多种组合。关于这个的话,可以看上面列表的6和8,比如说6也可以拆成2 + 2 + 2, 8也可以拆成 2 + 2 + 2 + 2,但是这样不是最大的乘积,最佳的结果中会尽可能的含有最多的3,这样思路就出来了:
首先如果输入是2和3的话,需要特判一下,他们必须要拆个1出来,其他的情况下尽量的用3去凑,凑不到原数的时候再去用2补,这里还有一点需要注意,因为用3凑的时候要么直接凑成原数,要么会少1或者少2,凑成原数和少2的情况下比较简单,直接加上0个或者1个2就行了,至于少1的情况,需要把前面的一个3借过来组成2 + 2才行.
代码如下:

class Solution {
public:
    int integerBreak(int n) {
        if (n == 2) return 1;
        if (n == 3) return 2;
        int max = -1;
        int num3 = 0, num2 = 0;
        num3 = n / 3;
        if(n % 3 == 2 || n % 3 == 0) num2 = (n % 3) / 2;
        else num3--, num2 = 2;
        return (int)pow(2, num2) * pow(3, num3);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值