代码随想录刷题Day40 | 343.整数拆分、96.不同的二叉搜索树
今日任务
343.整数拆分
数学方法
- 拆分成3最大
class Solution {
public:
int integerBreak(int n) {
if (n == 2) return 1;
if (n == 3) return 2;
if (n == 4) return 4;
int num_3 = n / 3; // n中3的个数
int m = n % 3;
if (m == 0) return pow(3, num_3);
if (m == 1) return pow(3, num_3 - 1) * 4;
return pow(3, num_3) * 2;
}
};
96.不同的二叉搜索树
动态规划
dp[i]
表示有i
个节点的二叉树有几种情况- 根据左右子树节点个数,可以得到状态转移方程为
dp[i] = dp[k] * dp[i - 1 - k]
k
表示左右节点的个数
class Solution {
public:
int numTrees(int n) {
if (n < 3) return n;
vector<int> dp(n + 1, 0);
dp[0] = 1; // 0个节点是一种情况
dp[1] = 1; // 1个节点也是一种情况
for (int i = 2; i <= n; ++i) {
for (int k = 0; k <= i - 1; ++k) {
// 根据左右子树节点数量来计算当前树有几种情况
dp[i] += dp[k] * dp[i - 1 - k];
}
}
return dp[n];
}
};