437. 路径总和 III-树的深搜/前缀和的使用

437. 路径总和 III

请添加图片描述

第一种方法:递归的方式,即将每个点都看成是根节点,看满足条件的个数。

时间和空间复杂度为 N 2 N^2 N2 N N N

int ans = 0;

int rootSum(TreeNode* root,int targetSum){
    if(root == nullptr)
        return 0;
    int ret = 0;

    if(root -> val == targetSum)
        ret ++;

    ret += rootSum(root->left, targetSum - root->val);
    ret += rootSum(root->right, targetSum - root->val);
    return ret;
}

int pathSum(TreeNode* root, int targetSum) {
    if(!root)
        return 0;
    int ret = rootSum(root, targetSum);

    ret += pathSum(root->left, targetSum);
    ret += pathSum(root->right, targetSum);
    return ret;

}

第二种是前缀和的方法,一次使用map记录前缀和的个数,通过map查看curr-targetsum的个数,如存在,则说明最近的若干个节点的和等于targetsum的值,结果+上map[curr-targetsum]的个数。

unordered_map<int, int> prefix;

int dfs(TreeNode* root, long long curr, int targetSum){
    if(root == nullptr)
        return 0;
    int ret = 0;

    curr += root->val;
    if(prefix.count(curr - targetSum)){
        ret = prefix[curr  - targetSum];
    }

    prefix[curr] ++;
    ret += dfs(root->left, curr, targetSum);
    ret += dfs(root->right, curr, targetSum);
    prefix[curr]--;

    return ret;
}

int pathSum(TreeNode* root, int targetSum) {
    prefix[0] =1;
    return dfs(root, 0, targetSum);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值