Leetcode---剑指Offer题14---剪绳子

目录

剑指Offer-面试题14---剪绳子

剪绳子1

https://leetcode-cn.com/problems/jian-sheng-zi-lcof/

给你一根长度为 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

这道题主要考察数学找规律的能力。数字>5时,尽量找出多的数字3。

        public int CuttingRope(int n)
        {
            if (n == 2)
                return 1;
            if (n == 3)
                return 2;

            int result = 1;
            while (n>4)
            {
                n -= 3;
                result *= 3;
            }

            result *= n;

            return result;
        }

  

剪绳子2

https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/

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

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

 这题要考虑大数,既然我们主要计算3的个数,当数字比较大时,相当于有很多的3相乘,这时候用快速幂就很效率了。

        private const int MODEL = 1000000007;  
      
        public int CuttingRope(int n)
        {
            if (n == 2)
                return 1;
            if (n == 3)
                return 2;

            long result = 1;
            //需要切割的3的个数
            long num3 = 0;

            while (n>4)
            {
                n -= 3;
                num3++;
            }

            result = QuickCal(3, num3);
            result = (result*n)% MODEL;

            return (int)result;
        }

        private long QuickCal(long a, long b)
        {
            long result = 1;
            a = a % MODEL;

            while (b > 0)
            {
                if (b%2==1)
                {
                    b--;
                    result = (result * a) % MODEL;
                }
                b /= 2;
                a = (a * a) % MODEL;
            }

            return result;
        }                
  

  

原文地址:https://www.cnblogs.com/Fflyqaq/p/12886540.html