题目描述:
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
例如,给定 n = 2,返回1(2 = 1 + 1);给定 n = 10,返回36(10 = 3 + 3 + 4)。
注意:你可以假设 n 不小于2且不大于58。
解题思路:
首先,我们要把n拆分为仅由2,3,4组成的数,且其中2和4的个数最多为1。
原因:对于大于4的数,如5,我们可以把它表示为2和3的和,即5 = 2+3,但2*3 = 6大于5,则在n的拆分中大于4的数应该要再拆分为2和3的和,而又因为对于2和3的公倍数而言,如6 = 2+2+2 = 3+3, 但3*3>2*2*2,因此在n的拆分中我们要有最多的3,同时要注意到,4 = 3+1 = 2+2,而2*2>3*1,即拆分到剩下4时,不应该继续拆分为3和1。
代码如下:
class Solution:
def integerBreak(self, n):
if n == 2:
return 1
if n == 3:
return 2
if (n-2) % 3 == 0:
m = (n-2) // 3
ret = 3 ** m * 2
elif (n-4) % 3 == 0:
m = (n-4) // 3
ret = 3 ** m * 4
else:
m = n // 3
ret = 3 ** m
return ret