剑指Offe 14- I. 剪绳子

发布时间 2023-08-26 15:27:41作者: 小星code

题目链接: 剑指Offe 14- I. 剪绳子

题目描述:
给你一根长度为 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。

解法思路:

贪心法
问题抽象:将一个整数n,切分成m个整数之和,使得m个整数的乘积最大。

结论:优先将整数拆分成若干个3,如果余2,就拆出一个 2;如果余1,就去掉一个3,拆出两个 2

代码:

func cuttingRope(n int) int {
    if n <= 3 {  //边界条件
        return 1*(n-1)
    }
    ans := 1
    if n % 3 == 1 {  //如果模3余1,说明一定可以拆成很多个3和一个4,所以答案乘4
        ans *=4
        n -= 4
    }
    if n % 3 ==2 {  //如果模3余2,说明一定可以拆成很多个3和一个2,所以答案乘 2
        ans *= 2
        n -= 2
    }
    for n > 0 {  //此时n一定是可以整除3的,因此将所有的3乘起来,得到最终的答案
        ans *= 3
        n -= 3
    }
    return ans 
}