🚩传送门:力扣题目
题目
给定一个正整数 ,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明:你可以假设 不小于
且不大于
。
解题思路:数学推导
设将整数 拆分为
个小数字:
本题求解:
以下数学推导总体分为两步: ① 当所有拆分出的数字相等时,乘积最大。 ② 最优拆分数字为 3 。
数学推导
以下公式为 “算术几何均值不等式” ,等号当且仅当 时成立。
推论一:若拆分的数量 确定, 则 各拆分数字相等时,乘积最大。
推论二:将数字 尽可能以因子
等分时,乘积最大。
推论证明
- 设将数字以因子 _ _等分为  个,即  [ **解释:** ] ,则乘积为 。
由于 为常数,当
取最大值时,乘积达到最大值。
- 根据分析,可将分体转化为求  的极大值,故而对  求导
取对数 (1)
对 x 求导 (2)
整理可得 (3)
- 令  ,则  ,易得驻点  ,可知  处取得极大值 。
- 由于  必须为整数,最接近  的整数为 `2` 或者 `3` 。代入发现 `x=3` 时乘积最大。
拆分规则
- 最优:
。把数字
可能拆为多个因子
,余数可能为
三种情况 。
- 次优:
。若余数为
;则保留,不再拆为
。
- 最差:
。若余数为
;则应把一份
替换为
,因为
。
备注:[ 我们希望全拆成 3
,但是显然不可能全都符合 ]
我们能证明当 取最大值,但是我们如何保证在不完全取
的情况下余数
的正解性呢 ?
- 首先余数为
,说明全是
。 [ 正解 ]
- 其次余数为
,说明全是
一个
。
- 全取
部分一定是最大的 。剩余的
部分也是最大的 。
- 本身
,
必须是整数,一定在
处取极大。 [ 正解 ]
- 最后余数为
,说明全是
一个
。
- 将其拆成
个
,一个
,一个
,
部分一定最大。
和
部分,拆成
更大 [ 正解 ]
算法流程
- 当
时,按照规则应不拆分,但题目要求必须拆分,因此拆出因子
,即返回
。
当
时,求
除以
的 整数部分
和 余数部分
(即
),并分类讨论
- 当
时,直接返回
;
- 当
时,要将一个
转换为
,因此返回
当
时,返回

- 当
复杂度分析
时间复杂度:,仅有求证、求余、次方运算 。
空间复杂度:,
和
使用常数大小额外空间 。
官方代码
class Solution {
public int integerBreak(int n) {
if (n <= 3) return n - 1;
int a = n / 3, b = n % 3;
if (b == 0) return (int) Math.pow(3, a);
if (b == 1) return (int) Math.pow(3, a - 1) * 4;
return (int) Math.pow(3, a) * 2;
}
}