清单
● 343. 整数拆分
● 96.不同的二叉搜索树
LeetCode #343 整数拆分
1. 题目
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。返回你可以获得的最大乘积。
2. 思路
初始思路:
解决题目需要满足两个条件:
- 拆分成k个整数
- 拆分整数集最大
因此:
3. dp数组的含义: 正整数n的最大乘积
4. 递推公式: dp[i] = dp[k] * dp[i-k]
5. 初始化: dp[2] = 2, dp[3] = 3
6. 遍历数组: 从前往后遍历
3. 代码实现
class Solution:
def integerBreak(self, n: int) -> int:
#特殊情况处理
if n <= 3:
return (n - 1) * 1
#dp数组
dp = [0] * (n + 1)
#初始化
dp[2] = 2
dp[3] = 3
for i in range(4, n + 1):
for j in range(1, i//2 + 1):
dp[i] = max(dp[i], dp[j] * dp[i-j])
return dp[i]
LeetCode #96 不同的二叉搜索树
1. 题目
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
2. 思路
初始思路:
- dp数组以及下角标的含义:dp[i]: 1~i 节点组成的二叉搜索树的个数dp[i]
- 递推公式:dp[i] += dp[i-1] * dp[i-j]
- 初始化: dp[0] = 0
- 遍历方向:从左往右
3. 代码实现
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]
return dp[i]