【剑指offer】14- I. 剪绳子

1.题目描述

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

提示

  • 2 <= n <= 58

方法:数学分析法

算法思想

1.设将长度为 n的绳子切为 a 段:n=n1+n2+n3....na,本题就等价于求n1*n2*n3.....na的最大值

2.

 3.因为本题已经提示n>2;所以只需要判断n=2和n=3的特殊情况

4.当n>4,将这段绳子切割成每段都是3的时候,存在3种情况

    a)最后剩余的绳子长度为0;

    b)最后剩余的绳子长度为1;

    c)最后剩余的绳子长度为2;

5.绳子剩余1的时候比较特殊,因为长度为4的绳子分成2*3比分成1*3的乘积要大,我们可以直接把这种特殊情况提出来,当n变化到小于等于4时,就直接令之前的累乘结果乘n就可以

代码

class Solution {
public:
    int cuttingRope(int n) {
       if (n==2)
            return 1;
        if (n==3)
            return 2;
        int sum=1;
        while (n>4){
            sum*=3;
            n-=3;
        }

        return sum*n;
    }
};

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃奈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值