剑指offer:给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1)

给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

示例1
输入
8
输出
18

题解思路

找出最优解的规律
当n等于1,2,3的时候,结果是固定的
当n大于3的时候,可以看以下数据
n=4, 最优解:2 2
n=5, 最优解:3 2
n=6, 最优解:3 3
n=7, 最优解:3 2 2
n=8, 最优解:3 3 2
n=9, 最优解:3 3 3
n=10,最优解:3 3 2 2
n=11,最优解:3 3 3 2
n=12,最优解:3 3 3 3
n=13,最优解:3 3 3 2 2
n=14,最优解:3 3 3 3 2
n=15,最优解:3 3 3 3 3

发现规律

  • 当n % 3 == 0 时,有n / 3个数字,没有2 ;
  • 当n % 3 == 1 时,有n / 3 + 1个数字,其中有2个2;
  • 当n % 3 == 2 时,有n / 3 + 1个数字,其中有1个2;

知道规律后代码如下:

public:
    int cutRope(int n) {
       	if(n <= 1){
            return 0;
        }
        if(n == 2){
            return 1;
        }
        if(n == 3){
            return 2;
        }
        //计算有多少个数字
        int length = n % 3 == 0 ? n / 3 : n / 3 + 1;
        //计算其中有多少个2
        int length1 = n % 3 == 0 ? 0 : 3 - n % 3;
        //结果
        int result = 1;
        for(int i = 0; i < length1; i++){
            result = result * 2;
        }
        for(int i = 0; i < length - length1; i++){
        	result = result * 3;
        }
        return result;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值