目录
题目
给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m <= n ),每段绳子的长度记为 k[1],...,k[m] 。请问 k[1] * k[2] *...* k[m] 可能的最大乘积是多少?
例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18 。
数据范围:2 ≤ n ≤ 60
进阶:空间复杂度O(1),时间复杂度O(n)
分析
如果把整数 n 分为两部分,那么这两部分的值相差越小乘积越大。同理还可以证明如果分成 3 部分,4 部分......也是相差越小乘积会越大。
因为 e = 2.718281828459,取 e 的近似值 3,即每份分为 3 乘积越大。
特殊情况:
当 n = 2 时,最大值为 1 * 1 = 1;
当 n = 3 时,最大值为 1 * 2 = 2;
当 n <= 4 时,有特殊情况,将 4 分为 2 * 2 和 1 * 3。我们发现2 * 2 > 1 * 3。
结论:
所以我们将循环条件设置为 n > 4,利用循环将绳子减去 3。最后得到的 n 就是剩余的绳子长度,可能的剩余长度有 1、2、3、4。将剩余长度与之前保存的 x 份 3相乘,即可得出最终答案。
代码实现
import java.util.*; public class Solution { public static void main(String[] args) { System.out.println(cutRope(2)); System.out.println(cutRope(3)); System.out.println(cutRope(4)); System.out.println(cutRope(16)); } public static int cutRope(int n) { if (n == 2 || n == 3) { return n - 1; } int num = 1; while (n > 4) { n -= 3; num *= 3; } return num * n; } } //输出结果 1 2 4 324
时间复杂度:O(n),运行x = n / 3次。
空间复杂度:O(1),使用一个常量 num 。
如有Bug,恳请指正,感谢访问!