JZ14 剪绳子

题目

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

数据范围: 2 \le n \le 602≤n≤60
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)

代码:

int cutRope(int number ) {

    int sum = 1;

    while(number > 4){

        sum *= 3;

        number -= 3;

    }

    sum *= number;

    return sum;

}

分析:问题的关键在于数字4,当长度为四时,剪开与不剪最大长度相同,<4时,剪开后乘积变小;>4时,剪开乘积变大。而且划分每段长度为3要优于每段长度为2,举例子为12,划分长度为3则是3*3*3*3 = 81,4*4*4 = 64。因此当number长度大于4时,就剪开一段长度为3,当不足4时,共有长度为2, 3, 4三种可能,直接乘就是其最大乘积。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值