题目链接:437. 路径总和 III - 力扣(LeetCode)
要从上到下找一条路径的和最简单的方法是遍历每个节点,然后从每个节点往下累加看看和对不对
这样是O(n²)的时间复杂度
可以计算一条路径上的前缀和方法,这样区间的和可以通过两个前缀和相减得到,可以通过哈希表来判断之前是否存在某个前缀和和当前的前缀和之差满足要求
注意哈希表的find会返回迭代器,找不到会返回末尾迭代器,count是调用了find实现,找到返回1,找不到返回0
class Solution {
public:int target, ans = 0;unordered_map<long long, int> prefix;void dfs(TreeNode *root, long long sum) {if (root == nullptr)return;sum += root->val;if (prefix.find(sum - target) != prefix.end())ans += prefix[sum - target];prefix[sum]++;dfs(root->left, sum);dfs(root->right, sum);prefix[sum]--;}int pathSum(TreeNode *root, int targetSum) {target = targetSum;prefix[0] = 1;dfs(root, 0);return ans;}
};