LeetCode刷题笔记——整数拆分问题
题目
- 整数拆分
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。
方法:
方法一:动态规划法
思路:
初始化dp数组为n+1,值为1
由于n大于等于2,所以,当
class Solution {
public:
int integerBreak(int n) {
// 初始化一个n+1的数组
vector<int> dp(n+1,1);
// n=2时,dp[2]=1
// 从3开始遍历
for(int i=3;i<=n;i++)
// 分割成两个数字的情况: j*(i-j)
// 对上面的情况的i-j再分割,分割成多个数字的情况,可以直接从动态规划数组中获得值。:j*(dp[i-j)
//选取这几个值里面的最大值。
for(int j=1;j<i;j++)
dp[i]=max(max(dp[i],j*(i-j)),j*dp[i-j]);
return dp[n];
}
};
方法二:贪心法
由于2和3可以合成任何数字。要拆成乘积最大的,就是要将原数尽可能多拆出3,然后再拆成2.
class Solution {
public:
int integerBreak(int n) {
if(n==2||n==3)
return n-1;
int a=n/3;
int b=n%3;
if(b==0)
return pow(3,a);
else if(b==1)
return pow(3,a-1)*4;
else
return pow(3,a)*2;
}
};