week12
111 - 二叉树的最小深度
class Solution {
public:
int minDepth(TreeNode* root) {
if(root == nullptr) return 0;
return dfs(root);
}
int dfs(TreeNode* root)
{
if(!root->left && !root->right) return 1; // 叶子节点
int l = INT_MAX, r = INT_MAX; // 限制只有一侧为空的情况
if(root->left) l = dfs(root->left);
if(root->right) r = dfs(root->right);
return min(l, r) + 1;
}
};112 - 路径总和
注意终点一定要是叶子节点;
class Solution {
public:
bool hasPathSum(TreeNode* root, int sum) {
if(root == nullptr) return false;
if(root->left == nullptr && root->right == nullptr) return sum == root->val;
return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right, sum - root->val);
}
};113 - 路径总和ii
同样是dfs 记录方案
114 - 二叉树展开为链表

115 - 不同的子序列
经典的两个字符串的动态规划问题;
状态表示:
f[i, j]表示s[1..i]与t[1..j]中满足子序列的方案数 状态计算: 分为选择当前s[i]和不选择两个方案
116 - 填充每个节点的下一个右侧节点指针
这题不要求常数空间的话,就是一个层序遍历的问题,和下一题的代码一样;
层序遍历版
如果要求常数空间的话,就要把next指针利用上完成层序遍历, 这里是通过当前层给下一层填写next指针

常数空间版
117 - 填充每个节点的下一个右侧节点指针ii
相较于上一题的满二叉树,这里就没有这么好的性质了,需要手动维护链表的头尾节点; 当然本题的代码上一题也能用了
118 - 杨辉三角
119 - 杨辉三角ii
节省空间就用翻转数组
120 - 三角形最小路径和
很经典的数字三角形动态规划问题;
从上到下DP路径的话会有额外的路径可行性判断问题(左右两端)
从上到下遍历
从下到上遍历
从下到上遍历可以消除这个额外的路径判断 不错这里要记住了
Last updated