My Sixty-fifth Page - 整数拆分 - By Nicolas

这篇page是针对leetcode上的343.整数拆分所写的。小尼先简单的说明一下这题的题意,给定一个正整数n,将其拆分为k个正整数,要求最后使得这个整数的乘积最大化。

小尼先简单的跟大家分析一下这道题的意思,其实就是我们需要做出最优解的操作,我们可以想一下,我们拿到的整数是n,我们需要将其进行对应的拆分,我们可以将它拆成两个或者是多个,当我们拆分成两个数进行相乘时是比较好判断的,就是直接做一个for的循环进行对应的遍历即可,而且求出来的结果也就j*(i-j),也就是我们将它分成的两个数可以从一开始进行对应的拆分,我们一个一个的与我们给出的n的减去我们遍历进行的数进行乘法运算

上面小尼跟大家讲解了两个数字的运算,当我们进行多个数字的运算的时候,我们这个时候就一定需要拥有最优的思想,我们设置了一个内置的for循环,进行我们的从一到n的之间所有的数字的一个最优的dp的解,我们通过dp的最优的解法在去做我们下一层的判断,在座的各位可能听到小尼现在所说的就有些许的迷惑了,小尼先拉一下对应的动态规划的代码:

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
        for(int i = 2; i <= n; i++){
            int curMax = 0;
            for(int j = 1; j < i ; j++){
                curMax = Math.max(curMax , Math.max(j * (i - j), j * dp[i - j]));
            }
            dp[i] = curMax;
        }
        return dp[n];
    }
}

小尼在最开始看这段代码的时候也是看的非常的迷惑的,其实小尼觉得贪心里面的奥秘就是我们的数组可以不断地记录我们前面情况的最优解,可以使得我们后面的条件可以直接的调用,这里设置了dp数组,我们一直往里面记录了1到n所有的数的dp的值,这个其实就是我们对最优解的记录,小尼也是现在这里跟大家解释一下其中的一点,就是我们虽然写了两层for循环,其中外面那一层是用来记录dp[i]的,而里面的那一层是遍历从1到j的所有dp数据的最优解,等到遍历完了最优解了之后我们再将数据放入dp数组中,以便我们下一次判断最优解中j * dp[i - j]的利用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值