文章目录
343.整数拆分
给定一个正整数 n
,将其拆分为 k
个 正整数 的和( k >= 2
),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
示例 1:
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
提示:
- 2 <= n <= 58
思路1:递归法(最直观的想法)
这个问题的目标是找出一个整数n的最大乘积,通过将其拆分为至少两个正整数的和。也就是说,可以出现多个正整数的情况。
递归思路
最直观的思路,我们要找的是一个整数n的最大乘积,可以将这个整数拆分为i和n-i(1 <= i < n)。对于每个i,我们可以选择将n-i继续拆分,也可以选择不再拆分。如果只拆成两个,就是i*(n-i)
。如果拆成多个,就是i*dfs(n-i)
。
所以对于每个i,我们需要比较i*(n-i)
和i*dfs(n-i)
的值,取所有结果中的最大值。
普通递归写法
- 注意找result的最大值,max的比较里一定要加上result本身,要存储for循环遍历中所有的最大值
- 注意(n-i)这样的情况要加括号,不然会发生逻辑错误
class Solution {
public:
int dfs(int n){
//递归终止条件:输入为1,也就是已经拆到1了,直接返回
if(n==1) return 1;
int result=0;
for(int i=1;i<n;i++){
//(n-i)加括号
result = max(result,max(i*(n-i),i*dfs(n-i)));//找到result的最大值,i*n-i是拆两个,i*dfs(n-i)是拆多个
}
return result;
}
int integerBreak(int n) {
return dfs(n);
}
};
注意点:max的嵌套
max()
函数在c++标准库中定义的版本只接受两个参数。也就是说max()
函数在每次调用时只比较两个值,因此,如果要比较三个或更多的值,需要将max()
函数嵌套在一起使用。例如下面:
result = max(result,max(i*n-i,i*dfs