《剑指Offer》刷题之剪绳子

《剑指Offer》刷题之剪绳子

我不知道将去向何方,但我已在路上!
时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 !
  • 题目
    给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
    输入描述: 输入一个数n,意义见题面。(2 <= n <= 60)
    输出描述: 输出答案。
  • 示例
示例 1 :
输入:8
返回值:18
  • 代码1:
# -*- coding:utf-8 -*-
class Solution:
    def cutRope(self, number):
        result = 1
        while number > 0:
            number = number -3
            if number == 1:
                result *= 4
                return result
            if number == 2:
                result *= 6
                return result
            result *= 3
        return result
  • 算法说明:
    不管怎么分,绳子第一刀都会分为两段,所以可以划分为子问题来求解;
    1 = 1;
    2 = 2;
    3 = 3;
    4 = 2 × 2;
    5 = 2 × 3;
    6 = 3 × 3;
    7以上的数都可以分解为2和3的乘积,而且当乘数里面含有3的个数越多,乘积较大;
    因此只要判断number中含有多少个三即可,逐步进行-3操作,知道最后小于3;
    如果余数为1,说明在执行-3操作之前,number = 4,而4的最大乘积还是 4;
    如果余数为2,说明在执行-3操作之前,number = 5,而5的最大乘积是 6;
    直到直到number <= 0结束程序。

猜你喜欢

转载自blog.csdn.net/qq_34331113/article/details/114998995