整数拆分

听说美团面试题有考这个,所以想刷一刷这种题型。

题目如下:

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

示例 1:

输入: 2

输出: 1

解释: 2 = 1 + 1, 1 × 1 = 1。

 

示例 2:

输入: 10

输出: 36

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

 

分析:

我们可以先看看前面几个数的拆分情况。2=1*1,3=1*2,4=2*2,5=2*3,6=3*3,7=3*2*2,8=2*3*3,9=3*3*3

由此,我们可以看出2,3是无法再进行拆分的,所以我们可以把数拆成尽可能多的3,对于3不能拆的部分则拆成2*2即可。

利用贪心进行求解就是 数 n/3=x  余数为y

有三种可能   余数y分别为 0,1,2

若余数为0 即9=3*3*3 这种情况  最大解=3**x

若余数为1 由7=3*2*2 可知 我们要把最后一个3 和1分为2*2才能得到最大解 即3**(x-1)*2*2

若余数为2 最大解为3**x*2

代码:

def integerBreak(n):
    if n <= 3 :
        return n-1
    x = n // 3
    y = n %3
    if y == 0:
        return 3**x
    if y == 1:
        return 3**(x-1)
    return 3**x*2

 

posted @ 2020-03-11 18:06  艾森小人物  阅读(181)  评论(0)    收藏  举报