• leetcode 437. 路径总和 III java


    题目:

    给定一个二叉树,它的每个结点都存放着一个整数值。

    找出路径和等于给定数值的路径总数。

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

    二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。

    示例:

    root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8

    返回 3。和等于 8 的路径有:

    1. 5 -> 3
    2. 5 -> 2 -> 1
    3. -3 -> 11

    解题:

    思路:

    对于树的话,采取DFS加回溯,每次访问到一个节点,把该节点加入到当前的pathSum中
    然后判断是否存在一个之前的前n项和,其值等于pathSum与sum之差
    如果有,就说明现在的前n项和,减去之前的前n项和,等于sum,那么也就是说,这两个点之间的路径和,就是sum

    最后要注意的是,记得回溯,把路径和弹出去

     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public int pathSum(TreeNode root, int sum) {
            int count = 0;
            HashMap<Integer, Integer> pathMap = new HashMap<>();
            // 路径长度为0的目前有一个
            pathMap.put(0, 1);
            return core(root, pathMap, sum, 0);
        }
    
        public int core(TreeNode root, HashMap<Integer, Integer> pathMap, int sum, int curSum) {
            if (root == null) return 0;
            curSum = curSum + root.val;
            // n = sum - curSum n为符合要求的路径,查找它的数量
            int answer = pathMap.getOrDefault(curSum - sum, 0);
            // 把当前的路径放入
            pathMap.put(curSum, pathMap.getOrDefault(curSum, 0) + 1);
            answer += core(root.left, pathMap, sum, curSum);
            answer += core(root.right, pathMap, sum, curSum);
            // 把之前放入的弹出
            pathMap.put(curSum, pathMap.get(curSum) - 1);
            return answer;
        }
    }
  • 相关阅读:
    离散时间基本信号1
    连续时间信号的基本运算2
    连续时间信号的基本运算1
    循环冗余校验码
    奇偶校验
    CAD编辑器哪个好用?如何使用CAD编辑器
    CAD转DXF怎么转换?教你三种转换方法
    CAD转PDF的软件哪个比较好用?用这两个很方便
    CAD简易口诀,保你一天就记住!零基础也能轻松学!CAD制图宝典!
    怎么将CAD转PNG格式?这两种方法值得收藏
  • 原文地址:https://www.cnblogs.com/yanhowever/p/11969218.html
Copyright © 2020-2023  润新知