leetcode 437. 路径总和 III

思路:
从该结点开始计算sum
从该节点开始继承之前的sum
重复很多枝,会从一个结点重复开始很多次,需要剪枝

class Solution {
public:
    int cnt = 0;
    int sum1 = 0;
    int pathSum(TreeNode* root, int sum) {
        this->sum1 = sum;
        findw( root,sum );
        return cnt;
    }
    void findw( TreeNode* root, int sum ){
        if( root == nullptr ){
            return ;
        }else if( sum-root->val == 0 && root->left == nullptr && root->right == nullptr){
            cnt ++;
            return ;
        }else if( sum-root->val == 0){
            cnt++;

        }
        if( root->left != nullptr ){
                findw( root->left,sum - root->val );
                findw( root->left,sum1 );
        }
        if( root->right != nullptr){
            findw( root->right,sum - root->val );
            findw( root->right,sum1 );
        }
    }
};

在这里插入图片描述

用两重递归,规定只从一个结点开始,定住开始的结点,避免重复


class Solution {
public:
    int cnt = 0;
    int sum1 = 0;
    int pathSum(TreeNode* root, int sum) {

        if (root == nullptr) {
            return 0;
        }

        return paths(root, sum)
                + pathSum(root->left, sum)
                + pathSum(root->right, sum);
    }

    int paths( TreeNode* root, int sum ){
        if (root == nullptr) {
            return 0;
        }

        int res = 0;
        if (root->val == sum) {
            res += 1;
        }

        res += paths(root->left, sum - root->val);
        res += paths(root->right, sum - root->val);

        return res;
    }
};

在这里插入图片描述


思路三
参考
https://leetcode-cn.com/problems/path-sum-iii/solution/liang-chong-fang-fa-jian-dan-yi-dong-ban-ben-by-a3/

class Solution {
public:
    int ssum = 0;
    int ret = 0;
    map<int,int>mp;
    int pathSum(TreeNode* root, int sum) {
        ssum = sum;
        mp[0] = 1;
        findw( root,0 );
        return ret;
    }

    void findw(TreeNode* root,int cur){
        if(root!=nullptr){
            if( mp[ cur+root->val - ssum] >= 1 ){
                ret += mp[ cur+root->val - ssum];
            }
            mp[cur+root->val] += 1;
            findw( root->left,cur+root->val );
            findw( root->right,cur+root->val );
            mp[cur+root->val] -= 1;
        }
    }
};

在这里插入图片描述

空间耗费挺大的,可能是因为map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值