动态规划part3 | 343. 整数拆分 ● 96.不同的二叉搜索树

文章介绍了使用动态规划方法解决343.整数拆分和96.不同的二叉搜索树问题。对于整数拆分,作者提供了两种思路的代码,一种是贪心策略,另一种是动态规划。在不同的二叉搜索树问题中,通过递推公式计算不同结构的树数量。文章强调了动态规划中需要考虑之前所有状态的重要性。
摘要由CSDN通过智能技术生成


343. 整数拆分

343.整数拆分

思路

动态规划的思想,根据前一个数的结果判断当前数。如果
前一个数中有3,升级成4
如果有1,升级成2
如果有2,升级成3

思路代码

func integerBreak(n int) int {
    res:=1
    for i:=3;i<=n;i++{
        if res%2==0&&i>4{
            res=res/2*3
        }else if res%3==0{
            res=res/3*4
        }else{
            res=res*2
        }
    }
    return res
}

代码

func integerBreak(n int) int {
    /**
    动态五部曲
    1.确定dp下标及其含义
    2.确定递推公式
    3.确定dp初始化
    4.确定遍历顺序
    5.打印dp
    **/
    dp := make([]int, n+1)
    dp[1] = 1
    dp[2] = 1
    for i := 3; i < n+1; i++ {
        for j := 1; j < i-1; j++ {
// i可以差分为i-j和j。由于需要最大值,故需要通过j遍历所有存在的值,取其中最大的值作为当前i的最大值,在求最大值的时候,一个是j与i-j相乘,一个是j与dp[i-j].
            dp[i] = max(dp[i], max(j*(i-j), j*dp[i-j]))
        }
    }
    return dp[n]
}
func max(a, b int) int{
    if a > b {
        return a
    }
    return b
}

困难

我的解法更像是贪心的思路。


96.不同的二叉搜索树

96.不同的二叉搜索树

官方题解

在这里插入图片描述

代码

func numTrees(n int) int {
    dp:=make([]int,n+1)
    dp[0]=1
    for i:=1;i<=n;i++{
        for j:=0;j<=i-1;j++{
            dp[i]+=dp[j]*dp[i-1-j]
        }
    }
    return dp[n]
}

困难

当1为头结点的时候,其右子树有两个节点,看这两个节点的布局,是不是和 n 为2的时候两棵树的布局是一样的啊!

(可能有同学问了,这布局不一样啊,节点数值都不一样。别忘了我们就是求不同树的数量,并不用把搜索树都列出来,所以不用关心其具体数值的差异)

当3为头结点的时候,其左子树有两个节点,看这两个节点的布局,是不是和n为2的时候两棵树的布局也是一样的啊!

当2为头结点的时候,其左右子树都只有一个节点,布局是不是和n为1的时候只有一棵树的布局也是一样的啊!


今日收获

需要之前所有dp值共同判断的动态规划。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值