LeetCode刷题(二) —— 整数拆分

题目:

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

例如,给定 n = 2,返回1(2 = 1 + 1);给定 n = 10,返回36(10 = 3 + 3 + 4)。

注意:你可以假设 n 不小于2且不大于58。


分析:

这个问题实际是一个动态规划问题。我们所要避免的是在和中尽可能少的出现1,所以

设n = x1 + x2 + x3 + ... + xi + ... + xn,那么乘积为x1 * x2 * x3 * ... xi * ...xn,若xi >=5,则xi = (xi - 3)+ 3 , 等式两边的乘积分别为xi 和 3(xi - 3) = 3xi - 9 。若要使 3xi - 9 < xi , 则要xi < 4.5,与xi >=5矛盾,所以xi >= 5,乘积最大不成立。

当n = 3 时,返回2(3 = 2 + 1);

当 n = 4 时,则可以拆分成 2 x 2 = 4 >3 x 1;

当n = 5 时,我们需要尽可能的避免和中出现1,所以 返回6(5 = 2 + 3);

当n = 6 时,可以拆分成2 + 2 + 2 和 3 + 3两种情况,很容易就可以知道2 x 2 x 2 = 8< 3 x 3 = 9。

所以我们可以得出当正整数n除以3得k余数为1时,我们需要将其转化为k - 1余数为4,当余数为0或2时保持不变,这样得到的正整数的和的乘积即为最大乘积。下面是Java代码:

class Solution {
    public int integerBreak(int n) {
        if(n < 4){
            return n - 1;
        }
        int count3 = 0;
        if(n % 3 == 0){
            return (int)Math.pow(3,n/3);
        }else if(n % 3 == 1){
            return (int)Math.pow(3,(n/3 - 1)) * 4;
        }else{
            return (int)Math.pow(3, n/3) * 2;
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值