343. 整数拆分
给定一个正整数 n
,将其拆分为 k
个 正整数 的和( k >= 2
),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
解题思路:
- 确定dp数组(dp table)以及下标的含义:dp[i]指是拆分数字i时最大化的乘机
- 确定递推公式: dp[i] = max(jx(i-j), i x dp[i-j], dp[i]), j x (i-j)当将i拆分成两个数时的乘机,ixdp[i-j]拆分成三个及以上的乘积
- dp数组如何初始化:dp[0] = 0, dp[1] = 0
- 确定遍历顺序:for i in range(n+1); for j in range(1, i)
- 举例推导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]