🚩传送门:力扣题目

题目

给定一个正整数 [LC]343. 整数拆分 - 图1,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

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

示例 2:

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

说明:你可以假设 [LC]343. 整数拆分 - 图2 不小于 [LC]343. 整数拆分 - 图3 且不大于 [LC]343. 整数拆分 - 图4

解题思路:数学推导

设将整数 [LC]343. 整数拆分 - 图5 拆分为 [LC]343. 整数拆分 - 图6 个小数字:
[LC]343. 整数拆分 - 图7

本题求解:
[LC]343. 整数拆分 - 图8

以下数学推导总体分为两步: ① 当所有拆分出的数字相等时,乘积最大。 ② 最优拆分数字为 3 。

数学推导

以下公式为 “算术几何均值不等式” ,等号当且仅当 [LC]343. 整数拆分 - 图9 时成立。

[LC]343. 整数拆分 - 图10

推论一:若拆分的数量 [LC]343. 整数拆分 - 图11 确定, 则 各拆分数字相等时,乘积最大。

推论二:将数字[LC]343. 整数拆分 - 图12 尽可能以因子 [LC]343. 整数拆分 - 图13 等分时,乘积最大。

推论证明

  1. - 设将数字以因子 ![](https://cdn.nlark.com/yuque/__latex/712ecf7894348e92d8779c3ee87eeeb0.svg#card=math&code=x&id=nCmKc)_ _等分为 ![](https://cdn.nlark.com/yuque/__latex/26fdbf8e53cb0e48da5f4ddd4aaf5a5c.svg#card=math&code=a&id=bru9k) 个,即 ![](https://cdn.nlark.com/yuque/__latex/e5bce13b8aa62f0cb33754c926c7499d.svg#card=math&code=n%3Dax&id=fi2JS) [ **解释:**![](https://cdn.nlark.com/yuque/__latex/60c205404e823c5402f8506f1349fe1c.svg#card=math&code=%5Csmall%7B%5Cfrac%7Bn%7D%7Ba%7D%3Dx%7D&id=Sadcq) ] ,则乘积为 ![](https://cdn.nlark.com/yuque/__latex/b0453ceda6faa81663f03d66d0d385a6.svg#card=math&code=x%5Ea&id=EXrRW)。


由于 [LC]343. 整数拆分 - 图14 为常数,当[LC]343. 整数拆分 - 图15 取最大值时,乘积达到最大值。

[LC]343. 整数拆分 - 图16

  1. - 根据分析,可将分体转化为求 ![](https://cdn.nlark.com/yuque/__latex/22f6ddd79568df89ddc4e176283a253c.svg#card=math&code=y%3Dx%5E%7B%5Cfrac%7B1%7D%7Bx%7D%7D&id=tx5aq) 的极大值,故而对 ![](https://cdn.nlark.com/yuque/__latex/712ecf7894348e92d8779c3ee87eeeb0.svg#card=math&code=x&id=xqcEB) 求导

[LC]343. 整数拆分 - 图17 取对数 (1)

[LC]343. 整数拆分 - 图18 对 x 求导 (2)
[LC]343. 整数拆分 - 图19

[LC]343. 整数拆分 - 图20 整理可得 (3)

  1. - ![](https://cdn.nlark.com/yuque/__latex/85e8f65be9616c1ba437affe9d60e27f.svg#card=math&code=y%5E%7B%27%7D%3D0%20&id=Tj41F) ,则 ![](https://cdn.nlark.com/yuque/__latex/db5dfd650baa9b9b878c3f24550ad7c0.svg#card=math&code=1-ln%20x%3D0&id=hS7bN) ,易得驻点 ![](https://cdn.nlark.com/yuque/__latex/17b49eda5cf9450d8ed5169946d57a4b.svg#card=math&code=x_0%3De%20%5Capprox%202.7&id=ZZCdw) ,可知 ![](https://cdn.nlark.com/yuque/__latex/85dc97ce1d819eacb00f66dbe120b56f.svg#card=math&code=x_0%20&id=y7IBh) 处取得极大值 。
  2. - 由于 ![](https://cdn.nlark.com/yuque/__latex/085d987d07cedb28f45177a783c7a3bc.svg#card=math&code=x%20&id=mZJUi) 必须为整数,最接近 ![](https://cdn.nlark.com/yuque/__latex/c9a277d40d3a0b3afb85cdb557908945.svg#card=math&code=e&id=UEc0u) 的整数为 `2` 或者 `3` 。代入发现 `x=3` 时乘积最大。

[LC]343. 整数拆分 - 图21
[LC]343. 整数拆分 - 图22

拆分规则

  1. 最优: [LC]343. 整数拆分 - 图23 。把数字 [LC]343. 整数拆分 - 图24 可能拆为多个因子[LC]343. 整数拆分 - 图25,余数可能为 [LC]343. 整数拆分 - 图26 三种情况 。
  2. 次优: [LC]343. 整数拆分 - 图27 。若余数为 [LC]343. 整数拆分 - 图28 ;则保留,不再拆为 [LC]343. 整数拆分 - 图29
  3. 最差: [LC]343. 整数拆分 - 图30 。若余数为 [LC]343. 整数拆分 - 图31 ;则应把一份 [LC]343. 整数拆分 - 图32 替换为 [LC]343. 整数拆分 - 图33,因为 [LC]343. 整数拆分 - 图34

备注:[ 我们希望全拆成 3 ,但是显然不可能全都符合 ]

我们能证明当 [LC]343. 整数拆分 - 图35取最大值,但是我们如何保证在不完全取 [LC]343. 整数拆分 - 图36 的情况下余数[LC]343. 整数拆分 - 图37 的正解性呢 ?

  1. 首先余数为[LC]343. 整数拆分 - 图38 ,说明全是 [LC]343. 整数拆分 - 图39 。 [ 正解 ]
  2. 其次余数为[LC]343. 整数拆分 - 图40 ,说明全是 [LC]343. 整数拆分 - 图41 一个 [LC]343. 整数拆分 - 图42
    • 全取 [LC]343. 整数拆分 - 图43 部分一定是最大的 。剩余的[LC]343. 整数拆分 - 图44 部分也是最大的 。
    • 本身 [LC]343. 整数拆分 - 图45[LC]343. 整数拆分 - 图46必须是整数,一定在 [LC]343. 整数拆分 - 图47处取极大。 [ 正解 ]
  3. 最后余数为 [LC]343. 整数拆分 - 图48 ,说明全是[LC]343. 整数拆分 - 图49 一个 [LC]343. 整数拆分 - 图50
    • 将其拆成 [LC]343. 整数拆分 - 图51[LC]343. 整数拆分 - 图52 ,一个[LC]343. 整数拆分 - 图53 ,一个[LC]343. 整数拆分 - 图54[LC]343. 整数拆分 - 图55 部分一定最大。
    • [LC]343. 整数拆分 - 图56[LC]343. 整数拆分 - 图57部分,拆成[LC]343. 整数拆分 - 图58更大 [ 正解 ]

算法流程

  1. [LC]343. 整数拆分 - 图59 时,按照规则应不拆分,但题目要求必须拆分,因此拆出因子[LC]343. 整数拆分 - 图60,即返回 [LC]343. 整数拆分 - 图61
  2. [LC]343. 整数拆分 - 图62 时,求 [LC]343. 整数拆分 - 图63 除以 [LC]343. 整数拆分 - 图64 整数部分[LC]343. 整数拆分 - 图65余数部分 [LC]343. 整数拆分 - 图66(即 [LC]343. 整数拆分 - 图67),并分类讨论

    • [LC]343. 整数拆分 - 图68 时,直接返回 [LC]343. 整数拆分 - 图69
    • [LC]343. 整数拆分 - 图70 时,要将一个 [LC]343. 整数拆分 - 图71 转换为 [LC]343. 整数拆分 - 图72 ,因此返回 [LC]343. 整数拆分 - 图73
    • [LC]343. 整数拆分 - 图74 时,返回 [LC]343. 整数拆分 - 图75

      1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2955945/1618842120946-098c3071-aefa-4ed8-8e46-f85d17920c0e.png#clientId=u3759d510-ff12-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=481&id=uaec17008&margin=%5Bobject%20Object%5D&name=image.png&originHeight=641&originWidth=854&originalType=binary&ratio=1&rotation=0&showTitle=false&size=44080&status=done&style=none&taskId=u866b2c7f-d7d1-4a02-aaad-cdae8872145&title=&width=641)

复杂度分析

时间复杂度:[LC]343. 整数拆分 - 图76,仅有求证、求余、次方运算 。

空间复杂度:[LC]343. 整数拆分 - 图77[LC]343. 整数拆分 - 图78[LC]343. 整数拆分 - 图79 使用常数大小额外空间 。

官方代码

  1. class Solution {
  2. public int integerBreak(int n) {
  3. if (n <= 3) return n - 1;
  4. int a = n / 3, b = n % 3;
  5. if (b == 0) return (int) Math.pow(3, a);
  6. if (b == 1) return (int) Math.pow(3, a - 1) * 4;
  7. return (int) Math.pow(3, a) * 2;
  8. }
  9. }