-
Notifications
You must be signed in to change notification settings - Fork 0
/
pathSum_3-437.java
71 lines (56 loc) · 1.88 KB
/
pathSum_3-437.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
// Date: 19-04-27
class Solution {
private int ret = 0;
public int pathSum(TreeNode root, int sum) {
Map<Integer, Integer> preSumMap = new HashMap<>();
preSumMap.put(0, 1);
DFSpathSum(root, preSumMap, sum, 0);
return this.ret;
}
// currentSum - anyPrefixSum = target
// ==> currentSum - target == anyPrefixSum
private void DFSpathSum(TreeNode root, Map<Integer, Integer> m, int sum, int preSum) {
if (root == null) return;
int currentSum = preSum + root.val;
int oldSum = currentSum - sum;
this.ret += m.getOrDefault(oldSum, 0);
m.put(currentSum, m.getOrDefault(currentSum, 0)+1);
DFSpathSum(root.left, m, sum, currentSum);
DFSpathSum(root.right, m, sum, currentSum);
m.compute(currentSum, (k, v) -> v -= 1);
}
}
/** The below won't work, since even if the current sum is bigger than target,
it may equal to it when met with a negetive number small enough.
// f(root) = ret + f(root.left) + f(root.right)
// f(null): 0
private int pathSumDfs(TreeNode root, int sum, int ps) {
if (root == null) return 0;
int r = 0;
if (root.val + ps == sum) {
r++;
ps = 0;
} else if (root.val == sum) {
r++;
ps = 0;
} else if (root.val + ps > sum) {
ps = root.val;
} else {
ps += root.val;
// r += pathSumDfs(root.left, sum, ps);
// r += pathSumDfs(root.right, sum, ps);
}
r += pathSumDfs(root.left, sum, ps);
r += pathSumDfs(root.right, sum, ps);
return r;
}
*/