leetcode——第343题——整数拆分

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

class Solution {
// public:
// /*************************法一::动态规划***********************************/
// // 时间复杂度:O(n^2)        空间复杂度:O(n)
//     int integerBreak(int n) 
//     {
//         // 1、确定 dp 数组以及下标的含义
//         // dp[i] 分拆数字 i,可以得到的最大乘积为 dp[i]

//         // 2、确定递归公式,取 0-i 的一个中间值 j,j 从 1 开始遍历,到 n-1
//         // dp[i] = max(dp[i], max(i * (j - i), j * dp[i - j]))

//         // 3、dp 的初始化              
//         // dp[0]=1   dp[1]=1  可能这么初始化有点牵强
//         // dp[2]=1            这个初始化,才是有意义的。

//         // 4、确定遍历顺序

//         vector<int> dp(n + 1);
//         dp[2] = 1;      // 下标 0 、 1 对应的元素忽略不计,所以 dp 数组得个数为 n+1
//         for(int i = 3; i <= n; i++)
//         {
//             for(int j = 1; j < i - 1; j++)
//             {
//                 dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]));
//             }
//         }
//         return dp[n];
//     }

public:
/*************************法二::贪心算法***********************************/
// 时间复杂度:O(n)        空间复杂度:O(1)
//首先这道题有点考数学知识的意思,算术几何均值不等式,取等的条件就是将其等分,经推导以3为取值最好。
    int integerBreak(int n) 
    {
        // 情况一:n 本身是 小于等于 4 的数,那么就分情况来处理
        if(n == 2)      return 1;
        if(n == 3)      return 2;
        if(n == 4)      return 4;
        
        // 情况二:n 大于 4 那么就将结果 乘一次 3 ,并把 n 减去一个3
        // 最后余下的结果(也就是最终的余数)可能为 1,2,3,4 这四种情况,
        // 将最后的余数 与 result相乘,即为最终结果。
        int result = 1;
        while(n > 4)
        {
            result *= 3;
            n -= 3;
        }
        result *= n;
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值