Leetcode: Path Sum III
Posted neverlandly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode: Path Sum III相关的知识,希望对你有一定的参考价值。
You are given a binary tree in which each node contains an integer value. Find the number of paths that sum to a given value. The path does not need to start or end at the root or a leaf, but it must go downwards (traveling only from parent nodes to child nodes). The tree has no more than 1,000 nodes and the values are in the range -1,000,000 to 1,000,000. Example: root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / 5 -3 / \ 3 2 11 / \ 3 -2 1 Return 3. The paths that sum to 8 are: 1. 5 -> 3 2. 5 -> 2 -> 1 3. -3 -> 11
Add the prefix sum to the hashMap, and check along path if hashMap.contains(pathSum+cur.val-target);
My Solution
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 public int pathSum(TreeNode root, int sum) { 12 if (root == null) return 0; 13 ArrayList<Integer> res = new ArrayList<Integer>(); 14 res.add(0); 15 HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 16 map.put(0, 1); 17 helper(root, sum, 0, res, map); 18 return res.get(0); 19 } 20 21 public void helper(TreeNode cur, int target, int pathSum, ArrayList<Integer> res, HashMap<Integer, Integer> map) { 22 if (map.containsKey(pathSum+cur.val-target)) { 23 res.set(0, res.get(0) + map.get(pathSum+cur.val-target)); 24 } 25 if (!map.containsKey(pathSum+cur.val)) { 26 map.put(pathSum+cur.val, 1); 27 } 28 else map.put(pathSum+cur.val, map.get(pathSum+cur.val)+1); 29 if (cur.left != null) helper(cur.left, target, pathSum+cur.val, res, map); 30 if (cur.right != null) helper(cur.right, target, pathSum+cur.val, res, map); 31 map.put(pathSum+cur.val, map.get(pathSum+cur.val)-1); 32 } 33 }
一个更简洁的solution:
1 public int pathSum(TreeNode root, int sum) { 2 HashMap<Integer, Integer> preSum = new HashMap(); 3 preSum.put(0,1); 4 return helper(root, 0, sum, preSum); 5 } 6 7 public int helper(TreeNode root, int sum, int target, HashMap<Integer, Integer> preSum) { 8 if (root == null) { 9 return 0; 10 } 11 12 sum += root.val; 13 int res = preSum.getOrDefault(sum - target, 0); 14 preSum.put(sum, preSum.getOrDefault(sum, 0) + 1); 15 16 res += helper(root.left, sum, target, preSum) + helper(root.right, sum, target, preSum); 17 preSum.put(sum, preSum.get(sum) - 1); 18 return res; 19 }
以上是关于Leetcode: Path Sum III的主要内容,如果未能解决你的问题,请参考以下文章