# 整数拆解

# 343. 整数拆分 (opens new window)

难度中等221收藏分享切换为英文关注反馈

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

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

示例 2:

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

说明: 你可以假设 n 不小于 2 且不大于 58。

# 1、规律推导(不太严谨,在没有办法时或快速求解时用这个方法求解)

第一步先列举出前面几个数的解,列举到大概能看出规律为止

然后总结规律

最后挑选几个值验证下规律是否正确

0 0
1 0
2 1+1 1
3 1+2 2
4 2+2 4
5 2+3 6
6 3+3 9 2+2+2 8
7 2+2+3 12
8 2+3+3 18
9 2+2+3 20
10  2+3+2+3 36
11  2+3+3+3 54
12 3+3+3+3 81
列举了下前12个,大概可看出最后拆分的都是3 ,所以最优拆解数字,余下的2
1
2
3
4
5
6
7
8
9
10
11
12
13
14

根据规律推导出:将n/3 得到3的个数,根据n%3的余数 0,1,2来做不同的处理

当余数为0时,说明正好能拆分成 n/3个3 积就是

3n/33^{n/3}

当余数为1时,需要拿出一个3与1整合成 4,这样积就是

3^{取整(n/3)-1}\times4

当余数为2时,积为

3^{取整(n/3)}\times2

代码:

/**
 * @param {number} n
 * @return {number}
 */
var integerBreak = function(n) {
    let initArr = [0,0,1,2]  //0-3的值
    if(initArr[n]!==undefined) return initArr[n]
    let a1 = n%3  //余数
    let a3 = Math.floor(n/3) //拆分3的数量
    if(a1===1){
        a3--
        return Math.pow(3,a3)*4
    }
    if(a1===2){
        return Math.pow(3,a3)*2
    }
    if(a1===0){
        return Math.pow(3,a3)
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

优化后代码

/**
 * @param {number} n
 * @return {number}
 */
var integerBreak = function(n) {
    let initArr = [0,0,1,2]//0-3的值
    if(initArr[n]!==undefined) return initArr[n]
    let remainder = n%3  //余数
    let num3 = Math.floor(n/3) //拆分3的数量
    if(remainder===1){
        return 3**(num3-1)*4
    }else{
        return 3**num3*remainder
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2、动态规划
更新时间: 5/5/2023, 11:19:52 AM