🚩传送门:力扣题目

题目

给你一根长度为 [LC]14. 剪绳子 II - 图1的绳子,请把绳子剪成整数长度的[LC]14. 剪绳子 II - 图2 段([LC]14. 剪绳子 II - 图3 都是整数,[LC]14. 剪绳子 II - 图4并且[LC]14. 剪绳子 II - 图5),每段绳子的长度记为 [LC]14. 剪绳子 II - 图6 。请问 [LC]14. 剪绳子 II - 图7 可能的最大乘积是多少?
例如,当绳子的长度是[LC]14. 剪绳子 II - 图8时,我们把它剪成长度分别为[LC]14. 剪绳子 II - 图9的三段,此时得到的最大乘积是[LC]14. 剪绳子 II - 图10
答案需要取模 [LC]14. 剪绳子 II - 图11[LC]14. 剪绳子 II - 图12),如计算初始结果为:[LC]14. 剪绳子 II - 图13,请返回[LC]14. 剪绳子 II - 图14

示例 1:

输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1

示例 2:

输入: 3 输出: 2 解释: 3 = 1 + 2, 1 × 2 = 2

示例 3:

输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

解题思路:数学推导

详情见同类题:数字拆分
取余防溢出定理:点击跳转 [LC]14. 剪绳子 II - 图15

复杂度分析

时间复杂度:[LC]14. 剪绳子 II - 图16,仅有求证、求余、次方运算 。

空间复杂度:[LC]14. 剪绳子 II - 图17[LC]14. 剪绳子 II - 图18[LC]14. 剪绳子 II - 图19 使用常数大小额外空间 。

官方代码

  1. class Solution {
  2. public int cuttingRope(int n) {
  3. if (n <= 3) return n - 1;
  4. int a = n / 3;
  5. int b = n % 3; // 余数0、1、2
  6. long res = 1;
  7. if (b == 0) {
  8. for (int i = 0; i < a; i++) {
  9. res = (res * 3) % 1000000007;
  10. }
  11. return (int) res;
  12. }
  13. if (b == 2) {
  14. for (int i = 0; i < a; i++) {
  15. res = (res * 3) % 1000000007;
  16. }
  17. return (int) ((res * 2) % 1000000007);
  18. }
  19. for (int i = 0; i < a - 1; i++) {
  20. res = (res * 3) % 1000000007;
  21. }
  22. return (int) ((res * 4) % 1000000007);
  23. }
  24. }