剑指 Offer 14- I. 剪绳子

题目描述:

思路:

首先,该问题可以转化成:

已经n可以由m个数字k[0], k[1], k[2], k[3]...k[m-1]相加而成,也就是n=k[0]+k[1]+k[2]+...,又很多种可能,但是必须保证n>1, m>1,求得最佳的方案,使得

k[0]*k[1]*k[2]*的乘积最大。并返回这个最大乘积

经过公式推导(具体公式推导在下方),当长度被平均划分为多个3组成的时候,最后得到的乘积结果,最大,但是往往并不是恰好能分为多个3构成,假设能划分为l个3加上最后的一个长度b(b的可能取值为0,1,2)。

然后分别对b的值为0,1,2进行讨论:

1、当b=0的时候,最大的长度就是3l

2、当b=1的时候,最大的长度就是pow(3, l-1)*(2*2)

3、当b=2的时候,最大的长度就是pow(3, l)*2

那么以上的结论怎么推导而来的呢?

具体推导过程在leetcode官网讨论区:公式推导

代码实现:

class Solution {
public:
    int cuttingRope(int n) {
        if(n<=3){ //为了保证在绳子的长度小于3的时候划分的绳子段数也大于1,于是单独提出来讨论。
            if(n==2){
                return 1;
            }
            else{
                return 2;
            }
        }
        if(n%3==0){
            return pow(3, n/3);
        }
        else if(n%3==1){
            return pow(3, n/3-1)*2*2;
        }
        else{
            return pow(3, n/3)*2;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值