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 - 二叉树展开为链表

avatar

115 - 不同的子序列

经典的两个字符串的动态规划问题;

状态表示: f[i, j] 表示s[1..i]t[1..j]中满足子序列的方案数 状态计算: 分为选择当前s[i]和不选择两个方案

116 - 填充每个节点的下一个右侧节点指针

这题不要求常数空间的话,就是一个层序遍历的问题,和下一题的代码一样;

  1. 层序遍历版

如果要求常数空间的话,就要把next指针利用上完成层序遍历, 这里是通过当前层给下一层填写next指针

avatar
  1. 常数空间版

117 - 填充每个节点的下一个右侧节点指针ii

相较于上一题的满二叉树,这里就没有这么好的性质了,需要手动维护链表的头尾节点; 当然本题的代码上一题也能用了

118 - 杨辉三角

119 - 杨辉三角ii

节省空间就用翻转数组

120 - 三角形最小路径和

很经典的数字三角形动态规划问题;

从上到下DP路径的话会有额外的路径可行性判断问题(左右两端)

  1. 从上到下遍历

  1. 从下到上遍历

从下到上遍历可以消除这个额外的路径判断 不错这里要记住了

Last updated