代码随想录二刷Day41
今日任务
343.整数拆分
96.不同的二叉搜索树
语言:Go
343. 整数拆分
链接:https://leetcode.cn/problems/integer-break/
func max(i, j int) int {
if i < j {
return j
}
return i
}
func integerBreak(n int) int {
//1.明确dp数组及下标的含义:将正整数i拆分为k个正整数的和,这些整数的乘积最大为dp[i]
//2.明确递归公式
//3.初始化dp数组: dp[1]=1,dp[2]=1,dp[3]=2,dp[4]=4,dp[5]=6,dp[6]=9
//4.明确dp数组遍历顺序
//5.举例验证dp数组
dp := make([]int, n + 1)
dp[2] = 1
for i := 3; i <= n; i++ {
for j := 1; j <= i / 2; j++ {
dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))
}
}
return dp[n]
}
96. 不同的二叉搜索树
链接:https://leetcode.cn/problems/unique-binary-search-trees/
func numTrees(n int) int {
dp := make([]int, n + 1)
dp[0] = 1
for i := 1; i <= n; i++ {
for j := 1; j <= i; j++ {
//要计算dp[i]的值,就是组合dp[0]~dp[i-1]
//dp[i]表示节点值从1到i互不相同二叉搜索树的个数
//每次头节点的值就是遍历1到i
dp[i] += dp[j - 1] * dp[i - j]
//左子树二叉搜索树的个数是从dp[0]开始计算的
//右子树二叉搜索树的个数是从dp[i-1]开始计算的
}
}
return dp[n]
}