定个小目标之刷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)全球极客挚爱的技术成长平台

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值