343. Integer Break 分析证明与python解答

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shouwangzhelv/article/details/51386383

3Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.
For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).
Note: you may assume that n is not less than 2.
Hint:
There is a simple O(n) solution to this problem.
You may check the breaking results ofn ranging from 7 to 10 to discover the regularities.
现在将2~10的分解结果列出来便于观察:
2:1*1
3:2*1
4:2*2
5:3*2
6:3*3
7:3*4
8:3*3*2
9:3*3*3
10:3*3*4
1、首先证明整数n分解后的因子只有2,3,4:
(1)证明分解后的单个因子不会超过4:
对于任意正整数N,将N分解为:
N=(N/2)+(N/2)(N为偶数)
N=((N-1)/2)+((N+1)/2)(N为奇数)
令(N/2)*(N/2)=N^2/4>N
((N-1)/2)*((N+1)/2)=(N^2-1)/4>N (N>0)
解得:
N>4 and N>根5+2
即正整数N>4时,总可以找到N的一种分解N=N1+N2,使得N1*N2>N,
所以,在此题目中对n进行分解时,n的单个因子不会大于4,
显然,在此题目中对n(n>3时)进行分解时,也不会出现因子1,可用反证法正,此处略。
于是我们得到n(n>3)分解后的因子为2,3,4
2、找规律,初步得到该问题的解:
2:1*1
3:2*1
4:2*2
5:3*2
6:3*3
7:3*4
8:3*3*2
9:3*3*3
10:3*3*4
显然规律形成了一个循环,形如3*3*…3(2/3/4)
于是我们猜测该问题的解(n>4):
n=3m-1: f(n)=3^(m-1)2 (对应3*3…*3*2)
n=3m : f(n)=3^m (对应3*3*…*3*3)
n=3m+1 : f(n)=3^(m-1)4 (对应3*3…*3*4)
证明(数学归纳法):
a.n=5,6,7时,用穷举法,上述三个等式得证。
b.假设m=k(m>2,m为正整数),即n=3k-1,3k,3k+1时,等式成立,下证当n=3(k+1)时,等式成立:
当n=3(k+1)时,n的因子分解可能出现这三种情况4*f(3k-1),3*f(3k),2*f(3k+1),对比三个式子3^(m-1)*8,3^(m+1),3^(m-1)*8,显然f(3(k+1))=max(4*f(3k-1),3*f(3k),2*f(3k+1))=3^(m+1),即f(3(k+1))=3^(m+1),同理可证:
f(3k+2)=3^(k)*2
f(3k+4)=3^(k)*4
3、综合上述,表达式得证。
python代码:
class Solution(object):
def integerBreak(self, n):
“””
:type n: int
:rtype: int
“””
if n==2:
return 1
elif n==3:
return 2
elif n==4:
return 4
else:
if n%3==0:
return 3**(n/3)
elif n%3==1:
return 3**(int(n/3)-1)*4
else:
return 3**(int(n/3))*2

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页