Given 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 and not larger than 58.
思路:
一开始觉得是很难的题,整数的拆分情况那么多。是不是要用递归?还是用NP?然而这是一道easy的题目哇
所以还是应该静下心来,从小的数字开始思考,一点一点试一试,找找规律看。
given n=2 return 2;
given n=3 return 2; (也就是说,拆分成3,比拆分成2更好)
given n=4 (4=2+2) return 4;
given n=5 (5=2+3) return 6; (拆分成5的话,还不如继续拆分下去,拆为2和3)
given n=6 (6=3+3) return 9; (拆分成6的话,拆成3和3是最好的)
given n=7 (7=3+4) return 12; (总之还是拆分成2和3的组合了)
所以呢,不管多大的数字,总归是拆分成2和3会更好的。
那么,3和4究竟谁更好呢?
given n=10 (10=3+3+4=3+3+3+1) return 36;
大致找到了规律,拆分成3的话,就不好继续拆分为2+1了。拆分成4的话,也不要再拆分成3+1了
given n=8 (8=4+4=3+3+2) return 18;
拆分为2个4的话,不如2个3+一个2更大。
所以综上,可以尽可能更多的拆分3,最后剩下一个2,或者一个4。不要有1的存在。
下面可以写代码了
public class Solution {
public int integerBreak(int n) {
if(n==2)
return 1;
else if(n==3)
return 2;
else if(n==4)
return 4;
int res = 1;
while(n>4){
res *= 3;
n -= 3;
}
res *= n;
return res;
}
}