leetcode343.整数拆分

题目大意

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

解题思路

方法一:

动态规划,对于数字num,可以拆分成数字k和数字num-k。然后找到两者乘积最大值,就是num的结果。(至于题目说拆分成多个,这里拆分成了两个的原因:在计算数字k时,数字k就是拆分后的最大乘积,所以计算num时,看似只是k和num-k相乘,实质上是k的最大拆分结果和num-k的最大拆分结果相乘)

class Solution {
public:
    int integerBreak(int n) {
    	if (n == 2)
    		return 1;
    	if (n == 3)
    		return 3;

    	vector<int> res(n, 1);
    	res[2] = 3;
    	for (int i = 3; i < n; ++i){
    		for (int j = 1; j < i; ++j){
    			res = max(res, res[j] * res[i - j]);
    		}
    	}
    	return res.back();
    }
};
方法二:

贪心策略,分析后可以发现,每个数字的拆分结果都会变成若干个3相乘以及最多两个2相乘。(总感觉贪心策略不好理解,不太明白为啥)

int integerBreak(int n) {
    if(n == 2)
        return 1;
    if(n == 3)
        return 2;
    int a = 1;
    while(n > 4){
        n = n - 3;
        a = a * 3;
    }
    return a * n;
}

猜你喜欢

转载自blog.csdn.net/qq_41092190/article/details/106114251