代码随想录Day 35|Leetcode|Python|343. 整数拆分 ● 96.不同的二叉搜索树

文章讲述了如何使用动态规划方法解决两个问题:1.将正整数n拆分成k个正整数,使得乘积最大;2.给定n个节点,计算形成不同二叉搜索树的种数。通过定义dp数组和递推公式,初始化和遍历顺序来求解这两个问题。
摘要由CSDN通过智能技术生成

343. 整数拆分 

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积 。

解题思路:

  1. 确定dp数组(dp table)以及下标的含义:dp[i]指是拆分数字i时最大化的乘机
  2. 确定递推公式: dp[i] = max(jx(i-j), i x dp[i-j], dp[i]), j x (i-j)当将i拆分成两个数时的乘机,ixdp[i-j]拆分成三个及以上的乘积
  3. dp数组如何初始化:dp[0] = 0, dp[1] = 0
  4. 确定遍历顺序:for i in range(n+1); for j in range(1, i)
  5. 举例推导dp数组
class Solution:
    def integerBreak(self, n: int) -> int:
        # 确定dp数组(dp table)以及下标的含义
        # 确定递推公式
        # dp数组如何初始化
        # 确定遍历顺序
        # 举例推导dp数组
        dp = [0]*(n+1)
        dp[0] = 0
        dp[1] = 0
        for i in range(1, n+1):
            for j in range(1, i):
                dp[i] = max(dp[i], j*(i-j), j*dp[i-j])
        return dp[n]

 96.不同的二叉搜索树 

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

解题思路:

确定dp数组(dp table)以及下标的含义:dp[i]整数i能组成的不同二叉搜索树

确定递推公式:dp[j] += dp[j-1]xdp[i-j],j指的是在i中的所有数字以j作为头节点组成的二叉树,j-1指比j小的左子树,i-j是比j大的右子树。不同头结点之间的关系是+=

dp数组如何初始化:dp[0] = 1

确定遍历顺序:从小到大for i in range(1, n+1); for j in range(1, i+1)

举例推导dp数组

class Solution:
    def numTrees(self, n: int) -> int:
        dp = [0]*(n+1)
        dp[0] = 1
        for i in range(1, n+1):
            for j in range(1, i+1):
                dp[i] += dp[j-1]*dp[i-j]#left subtree + right subtree
        return dp[n]

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值