【代码随想录训练营】【Day40休息】【Day41】第九章|动态规划|343. 整数拆分|96.不同的二叉搜索树

前言

最近实在是太忙了,忙着准备面试,忙着准备教案,所以刷题的时间和速度都赶不上来了,希望自己能够尽快改掉拖延的坏毛病吧;不过说实话,我也不是拖延症犯了,而是事情实在太多,基本每天都是忙里忙外的,除了喜欢睡懒觉,其他时间基本都是在忙要么就是在学习,真的是累死了。

动态规划的题,知道用动态规划的算法思想来解题的话就很简单,只要记住动态规划就是利用已知解来求未知解的算法就行,真正难的地方是在于怎么看出一道题是利用动态规划来解题的,也就是什么时候应该用到动态规划,这可能就需要经验的累积了。

实在太忙,所以没啥时间解释了,直接做题然后贴上训练营准备好的题解吧,写得也比我自己解释的清晰一点。


整数拆分

题目详细:LeetCode.343

这道题的难点在于如何确定递推公式?

递推公式:dp[i] = max(dp[i], max((i-j)*j, dp[i-j]*j));

  • j * (i - j) 是单纯的把整数拆分为两个数相乘
  • j * dp[i - j]是拆分成两个以及两个以上的个数相乘。

利用双重for循环,计算每一个整数所有的拆分情况的乘积,并让dp[j]保留一个最大值

详细的题解可查阅:《代码随想录》— 整数拆分

Java解法(动态规划):

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

不同的二叉搜索树

题目详细:LeetCode.96

这道题我看了题解之后,还是一知半解的,日后还需要再多多研究

详细的题解可查阅:《代码随想录》— 不同的二叉搜索树

Java解法(动态规划):

class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        for(int i = 1; i <= n; i++){
            for(int j = i; j >= 1; j--){
                dp[i] += dp[i - j] * dp[j - 1];
            }
        }
        return dp[n];
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值