整数拆分(LeetCode-343)

简介: 整数拆分(LeetCode-343)

6. 整数拆分(LeetCode-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


思路

拆数字 i ,可以得到的最大乘积为 dp[i]


可能会是两数相乘所得,也有可能是三数及以上相乘所得。这里就分两种情况取较大值即可。


变量 i 从 1 遍历到 n-1 ,两数相乘情况下结果为 i ∗ ( n − i )  ,三数及以上相乘情况下结果为 i ∗ d p [ n − i ] 。这里的 dp[n-i] 是拆分数字 n-i 的最大乘积,其实是已经拆分过的,它就已经是几个数相加等于 n-i 的情况了,这点要理解,主要是想明白数组的含义

d p [ n ] = m a x ( i ∗ ( n − i ) , i ∗ d p [ n − i ] )


dp[2]=1


先有 dp[n-i] 再有 dp[n] ,所以从前往后


测试用例


代码展示

class Solution
{
public:
    int integerBreak(int n)
    {
        vector<int> dp(n + 1);
        dp[2] = 1;
        for (int i = 3; i <= n; i++)
        {
            for (int j = 1; j < i - 1; j++)
            {
                // max函数只能两两比较
                dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
            }
        }
        return dp[n];
    }
};
目录
相关文章
|
7月前
|
测试技术
代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II
代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II
22 1
|
4月前
leetcode-343:整数拆分
leetcode-343:整数拆分
18 0
|
4月前
|
机器学习/深度学习
leetcode-52:N皇后 II
leetcode-52:N皇后 II
15 0
|
4月前
|
Java
leetcode-53:最大子序和
leetcode-53:最大子序和
21 0
|
11月前
|
机器学习/深度学习 算法 安全
LeetCode - #52 N皇后 II
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
LeetCode - #52 N皇后 II
|
12月前
|
人工智能 算法 C++
每日算法系列【LeetCode 992】K个不同整数的子数组
每日算法系列【LeetCode 992】K个不同整数的子数组