首页 > 其他分享 >leetcode 437. 路径总和 III

leetcode 437. 路径总和 III

时间:2023-02-21 19:04:29浏览次数:54  
标签:return val int root sum findw 437 III leetcode

思路:
从该结点开始计算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 );
        }
    }
};

leetcode 437. 路径总和 III_其他

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


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;
    }
};

leetcode 437. 路径总和 III_递归_02


思路三
参考
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;
        }
    }
};

leetcode 437. 路径总和 III_其他_03

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

标签:return,val,int,root,sum,findw,437,III,leetcode
From: https://blog.51cto.com/liyunhao/6077020

相关文章

  • leetcode 405. 数字转换为十六进制数
    除以16取余继续这个过程直到为0对于负数,直接将int转成unsignedint运算即可法二:利用位运算取出每四位,然后对应一个字母classSolution{public:stringtoHe......
  • leetcode 99. 恢复二叉搜索树
    中序遍历,弄在数组里面,再弄个数组复制一份排好序比较哪里错了,换回来中序遍历的时候用map存一下数字的地址(默认没有重复元素)classSolution{public:vector<int>zh......
  • leetcode 40. 组合总和 II
    利用set去重,一维vector判断相等需要都按照一种顺序排好超时classSolution{public:vector<vector<int>>ret;vector<int>can;set<vector<int>>ans;......
  • leetcode 56. 合并区间
    区间左端点进行排序如果intervals小于等于一个元素直接返回如果大于1个按照左边点进行排序从左至右依次合并classSolution{public:staticboolcmp(vector<int>&a,vec......
  • leetcode 589. N叉树的前序遍历
    递归classSolution{public:vector<int>ret;vector<int>preorder(Node*root){findw(root);returnret;}voidfindw(Node*root){......
  • leetcode 307. 区域和检索 - 数组可修改 前缀和 | 线段树
    前缀和查询是O(1)更新是O(n)classNumArray{public:vector<int>sum;vector<int>nums;NumArray(vector<int>&nums){this->nums=nums;sum......
  • leetcode 382. 链表随机节点
    从头开始计数第i个点选择的概率是只需要区[0,i-1]的随机数,如果,取到了0,就更新返回值,否则不更新classSolution{public:/**@paramheadThelinkedlist'shead.......
  • leetcode 303. 区域和检索 - 数组不可变
    前缀和classNumArray{public:vector<int>sum;NumArray(vector<int>&nums){if(nums.size()>0){sum.push_back(nums[0]);}......
  • leetcode 105. 从前序与中序遍历序列构造二叉树
    递归,在中序中找前序的第一个元素,之后切割成两个相同子问题classSolution{public:TreeNode*buildTree(vector<int>&preorder,vector<int>&inorder){if(......
  • leetcode 53. 最大子序和
    classSolution{public:intmaxSubArray(vector<int>&nums){if(nums.size()==1){returnnums[0];}intsum=0;int......