定个小目标之刷LeetCode热题(42)

437. 路径总和 III

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

今天看这道题目,主要思想是递归+前缀和,之前有做过前缀和的题目,假设我们要在一数组中寻找连续子数组和为 targetSum 的序列,那么我们可以用 map 记录前缀和 curr 以及出现的次数num,当 map 中存在 curr - targetSum 时说明存在连续子数组和为 targetSum 的序列,代码如下

class Solution {
    public int pathSum(TreeNode root, int targetSum) {
        // 首先定义一个map数据结构,用于存储前缀和出现的次数
        Map<Long, Integer> map = new HashMap<Long, Integer>();
        // 前缀和为0的次数默认为1
        map.put(0L, 1);
        return dfs(root, map, targetSum, 0L);
    }

    private int dfs(TreeNode root, Map<Long, Integer> map, long targetSum, Long curr) {
        if (root == null) {
            return 0;
        }
        int ret = 0;
        curr += root.val;
        // 判断是否出现和为targetSum的序列
        ret = map.getOrDefault(curr - targetSum, 0);
        // 将这个前缀和存储到map中
        map.put(curr, map.getOrDefault(curr, 0) + 1);
        // 递归遍历左子树
        ret += dfs(root.left, map, targetSum, curr);
        // 递归遍历右子树
        ret += dfs(root.right, map, targetSum, curr);
        // 前缀和思想就是在map中寻找curr - targetSum,避免左右子树的前缀和相互影响,每次遍历完都要将其次数置为0
        map.put(curr, map.getOrDefault(curr, 0) - 1);

        return ret;
    }
}

题目链接:题单 - 力扣(LeetCode)全球极客挚爱的技术成长平台

上一篇:【Portswigger 学院】文件上传


下一篇:LeetCode 290. 单词规律