题目描述
给你一根长度为 $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。
示例 1:
1 | 输入: 2 |
示例 2:
1 | 输入: 10 |
提示:
- $2 <= n <= 58$
注意:本题与主站 343 题相同:https://leetcode-cn.com/problems/integer-break/
算法
(数学) $O(n)$
拆分原则:尽可能的拆出多个 3
四部曲:
- 如果 $n <= 3$ 拆成 $1$ 和 $n - 1$
- 如果 $n % 3 == 1$ 拆出一个 $4$
- 如果 $n % 3 == 2$ 拆出一个 $2$
- 最后剩下的全拆成 $3$
时间复杂度
$O(n)$
空间复杂度
$O(1)$
C++ 代码
1 | class Solution { |