【剑指offer】剪绳子

题目描述

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

输入描述:

输入一个数n,意义见题面。(2 <= n <= 60)

输出描述:

输出答案。
分析:抽象一下题目就是把n分成很多个数字,要求这些数字的乘积最大,问你最大的乘积是多少?
先找一下规律

* 先举几个例子,可以看出规律来。

* 4 : 2*2

* 5 : 2*3

* 6 : 3*3

* 7 : 2*2*3

* 8 : 2*3*3

* 9 : 3*3*3

* 10:2*2*3*3

* 11:2*3*3*3

* 12:3*3*3*3

* 13:2*2*3*3*3

我们发现分解的数字中只有2和3,这样的话乘积才能最大,相对于2,肯定是取3更加的好,所以是能取3的时候一定取3,所以是n/3
当n%3==0时,也就是全都是3的时候,这个时候乘积肯定最大
当n%3==1时,注意1*3……*3肯定没有2*2*3*……*3大,所以我们应该把一个3拿出来和剩下的那个1组成2*2的形式
当n%3==2时,2*3*……*3的形式乘积最大
时间复杂度:O(1)
class Solution
{
public:
    int cutRope(int n)
    {
        if(n==2)
            return 1;
        if(n==3)
            return 2;
        int x=n%3;
        int y=n/3;
        if(x==0)
        {
            return pow(3,y);
        }
        else if(x==1)
        {
            return 2*2*pow(3,y-1);
        }
        else if(x==2)
        {
            return 2*pow(3,y);
        }
    }
};

posted @ 2019-09-27 15:38  西*风  阅读(280)  评论(0编辑  收藏  举报