其他分享
首页 > 其他分享> > 343. 整数拆分 | 暴力求解 | 暴力递归 | 动态规划 | 自顶向下分析

343. 整数拆分 | 暴力求解 | 暴力递归 | 动态规划 | 自顶向下分析

作者:互联网

力扣打卡:343. 整数拆分

解题思路

可能思路不是很好想到

流程

举个例子

给定一个数 10

代码

class Solution {
    public int integerBreak(int n) {
        // 理解原理: 每一个数都可以分解成 1 + n-1 | 2 + n-2 | 3 + n-3 ....
        //          同时这其中的n-1,n-2,n-3又可以重新分为小于其的最大整数和1,依次类推
                    // 需要考虑的是:这些数可以一直分解,直至小于2时,不能分解成两个整数的和了,那么停止
                    // 也就是说

        // 这也就是说明了,只需要考虑两个数的情况就可以了,不需要考虑分解成三个或者是分解成四个这种场景
        // 因为每个数分解成两个数之后,这两个数的又可以分解成两个数,然后再次分解成两个数,最后在范围内的分解都存在


        // 那么定义一个函数,能够得到给定的数的最大乘积

        // return planA(n);

        int[] memo = new int[n+1]; // 需要n+1的长度进行储存数据n
        return planB(n, memo);
    }   

    public int planA(int n){
        if(n < 2) return 0; // 当 n 已经小于 2, 此时不能再进行分解了, 也就是返回0

        int max = 0; // 初始化为0
        for(int i=1; i<n; i++){
            
            int subAns = planA(n-i);
            
            int subMax = Math.max(n-i, subAns);
            
            max = Math.max(max, i * subMax);
        }

        return max;
    }

    // 写出了暴力递归的方式,那么自顶向下的动态规划也就是多了判断和记录的两个过程
    public int planB(int n, int[] memo){
        if(n < 2) return 0; // 如果此时的n小于2,那么不能再进行分解了
        if(memo[n] != 0) return memo[n];

        int max = 0;
        for(int i=1; i<n; i++){
            int subAns = planB(n-i, memo);
            int subMax = Math.max(n-i, subAns); //  这里的意思是指: n-i 的大小 和 n-i 分解成某一些数字后的乘积的大小的对比
            max = Math.max(max, i * subMax);
        }
        memo[n] = max;
        return memo[n];
    }
}

标签:分解成,暴力,int,max,subMax,分解,自顶向下,343,memo
来源: https://blog.csdn.net/qq_45759413/article/details/121986352