LC343. 整数拆分

题目: 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

思路

第一反应直接暴力枚举每个拆分方案,然后取乘积比较,但是较大的数对较小的数有包含关系,如4的两种拆分(1,3),(1,1,2),后者的(1,2)也可以看作前者(3)的一种拆分,所以可以发现递推关系 4的结果(拆出一个1的情况)=取最大(1*(3),1*(3的结果)…)
进而泛化为 res(n)=i*max(n-i,res(n-i)) i:1->n/2 (过半后重复)

解题方法 一

直接搜索,自顶向下遍历每一种拆分方式
递归终止条件是n=0/1 此时返回0,如果是已经搜过的方案,返回保存的记录
每一层从1…n/2逐步拆分 更新最大值
把结果保存,降低时间复杂度

复杂度

时间复杂度:

O ( n ) O(n) O(n)

Code

class Solution {
    int[] dp;
    public int integerBreak(int n) {
        dp=new int[n+1];
        return dfs(n);
    } 
    int dfs(int n){
        if(n<=1) return 0;
        if(dp[n]!=0) return dp[n];

        int ans=Integer.MIN_VALUE;
        for(int i=1;i<=n/2;i++){
            ans= Math.max(ans,i*Math.max(dfs(n-i),n-i));
        }
        dp[n]=ans;
        return dp[n];
    }
}

解题方法 二

动态规划,自底向上迭代 dp[i]表示划分数字i时它的组分最大乘积
初始化 dp[2] =1 (dp[0]/[1]默认为0)
每一层从1…n/2逐步拆分 更新最大值

复杂度

时间复杂度:

O ( n 2 ) O(n^2) O(n2)

Code

class Solution {
    public int integerBreak(int n) {
        int[] dp=new int[n+1];//dp[i]表示划分数字为i时它的组分最大乘积
        //初始化
        dp[2]=1;
        for(int idx=3;idx<=n;idx++){
            for(int cut=1;cut<=n/2&&cut<idx;cut++){
                dp[idx]=Math.max(dp[idx],cut*Math.max(idx-cut,dp[idx-cut]));
            }
        }
        return dp[n];
    }
}

相关推荐

  1. LC343. 整数

    2024-04-23 19:50:04       14 阅读
  2. leetcode 343.整数

    2024-04-23 19:50:04       15 阅读
  3. LeetCode 343. 整数

    2024-04-23 19:50:04       10 阅读
  4. 343. 整数(力扣LeetCode)

    2024-04-23 19:50:04       16 阅读
  5. [力扣题解] 343. 整数

    2024-04-23 19:50:04       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 19:50:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 19:50:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 19:50:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 19:50:04       18 阅读

热门阅读

  1. c++ primer plus(1)

    2024-04-23 19:50:04       11 阅读
  2. Unity学习笔记之——PlayerPrefs

    2024-04-23 19:50:04       11 阅读
  3. git小白教程

    2024-04-23 19:50:04       14 阅读
  4. 数据库表按月进行分区

    2024-04-23 19:50:04       11 阅读
  5. python项目练习——31.赛车游戏

    2024-04-23 19:50:04       10 阅读
  6. 第19届PTA天梯赛 别再来这么多猫娘了

    2024-04-23 19:50:04       13 阅读
  7. 商城数据库----3

    2024-04-23 19:50:04       14 阅读