- 整数拆分
暴力递归法 (n超过43后超时)
当前整数为n,记最大乘积为f(n)。
求f(n)时
递归求解2*f(n-2)、3*f(n-3)、…、(n-2)*f(n-(n-2));
用max记录递归求解后的最大乘积。
每次求解记录 i*f(n-i)与i*(n-i)的较大值记为max1,与max进行比较,若大于max,则复制给max。
递归求解结束max即为最大乘积。
时间复杂度分析:
每一层循环都会有max()求职和if()判断比较,记总消耗时间为k
则f(n)时间复杂度为 f(2)+f(3)+…+f(n-2)+(n-3)*K
则f(n-2)时间复杂度为 f(2)+f(3)+…+f(n-4)+(n-5)*K
…
f(1)、f(2)、f(3) 时间消耗为1;
则f(n)的时间复杂度为…
class Solution {
public:
int integerBreak(int n) {
return recur(n);
}
int recur(int n){
if(n == 1 || n == 2) return 1;
int max1 = n-1;
for(int i = 2;i < n-1;i++){
int tmp = max(i * recur(n-i),i * (n-i));
if(tmp > max1) {
max1 = tmp;
}
}
return max1;
}
};