343. 整数拆分

343. 整数拆分

1.题目描述

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
在这里插入图片描述
示例 2:
在这里插入图片描述
说明: 你可以假设 n 不小于 2 且不大于 58。

2.方法1(动态规划)

动态规划,转移方程: r e s u l t [ i ] = m a x ( r e s u l t [ i ] , m a x ( j ∗ r e s u l t [ i − j ] , j ∗ ( i − j ) ) ) result[i] = max(result[i], max(j * result[i - j], j * (i - j))) result[i]=max(result[i],max(jresult[ij],j(ij)))
j ∗ ( i − j ) j *(i - j) j(ij)表示的是将i分成两份
j ∗ r e s u l t [ i − j ] j * result[i - j] jresult[ij]表示的是将 i i i分成 j j j i − j i - j ij所取得最大乘积的分法。

3.代码

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n+1);
        dp[1] = 1;
        for(int i = 2;i <= n;++i){
            for(int j = 1;j < i;++j){
                dp[i] = max(dp[i],max(j*(i-j),j*dp[i-j]));
            }
        }
        return dp[n];
    }
};

4.复杂度分析

时间复杂度:O(n^2)
空间复杂度:O(n)

5.方法2(数学法)

当两个整数尽量平分n的时候,两个整数的乘积才能达到最大,(比如,当n = 10时,分成两份,必定是5, 5。当n = 11时,分成两份,必定是5、6)
推广:
将n 分成cnt份(cnt <= n),必定是(n % cnt) 个 (n / cnt + 1)和 (cnt - n % cnt )个 (n / cnt)乘积最大。(其中n / cnt是表示均分所得,n % cnt是表示均分成cnt份后多出的1个数,再分给其中 n % cnt 个 n / cnt)(比如,n = 10,求分成cnt = 3份的最大乘积。均分所得 num = n / cnt = 3, 多出的1的个数 为 n % cnt = 1, 再将多出的1分配到其中均分所得的元素中,n / cnt + 1)

6.代码

class Solution {
public:
    int integerBreak(int n) {
        int res = 0;
        for(int i = 2;i <= n;++i){
            int numCount = n % i;//多出1的个数
            res = max(res,(int)(pow(n/i,i-numCount)*pow(n/i+1,numCount)));
        }
        return res;
    }
};

7.复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)

你可能感兴趣的:(LeetCode动态规划,动态规划,leetcode,数据结构)