Leetcode-Integer Break

本题的题意是给定一个整数N,将其拆分为至少两个正数,且这些正数的和为N,求所有拆分种类中这些正数的乘积最大!
思路,枚举发现规律。
如下:7 = 3+2+2 F(7)=3^1 2^2 = 12
8 = 3+3+2 F(8)=3^2
2^1 = 18
9 = 3+3+3 F(9)=3^3 2^0 = 27
10 = 3+3+2+2 F(10)=3^2
2^2 = 36
可以发现,N = 3a+2b,(a,b为数字3,数字2的个数),F(N)=3^a+2^b。因此,可以先通过N/3求得有多少个3构成,如果余数为0,则没有数字2;余数为2,则有一个2;余数为1,则数字3减少1个,添加两个2(如10=3+3+3+1 转变成 3+3+2+2)。
最后考虑边缘条件,当N=2,N=3的情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
int integerBreak(int n) {
if(n==2) return 1;//边缘情况
if(n==3) return 2;
if(n % 3 == 0) //余数为0
return (int)pow(3.0,n/3);
else if(n % 3 == 2) //余数为2
return (int)pow(3.0,n/3) * 2;
else //余数为1
return (int)pow(3.0,n/3-1) * 4;
}
};