LeetCode 437.路径总和III **

基本思想:

暴力太过暴力;

利用前缀和做;

前缀和具体思想:
维持一个递增序列,并且n u m s [ j ] − n u m s [ i ] nums[j]-nums[i]nums[j]nums[i]即为i~j的和;

从根到叶维护一个前缀和map,每次查,cur-targetSum是否在map中;

值得注意的是,可能有多个符合标准的前缀和,此时说明有多条路径满足,这一点注意一下;

因此根结点必须要设置为map[0]=1;

基本代码:

1.暴力搜索:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void dfs(TreeNode* root,int sum,int targetsum){
        if(root==nullptr){
            return;
        }
        if(targetsum==sum+root->val){
            cnt++;
        }
        dfs(root->left,sum+root->val,targetsum);
        dfs(root->right,sum+root->val,targetsum);
    }
    
    void mdfs(TreeNode* root,int targetsum){
        if(root==nullptr)
            return;
        dfs(root,0,targetsum);
        mdfs(root->left,targetsum);
        mdfs(root->right,targetsum);
    }
    
    int pathSum(TreeNode* root, int targetSum) {
        mdfs(root,targetSum);
        return cnt;
    }
private:
    int cnt=0;
};

2.前缀和:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int dfs(TreeNode* root,int cur,int targetsum){
        if(root==nullptr){
            return 0;
        }
        cur+=root->val;
        int cnt=0;
        if(mp[cur-targetsum]!=0){
            cnt+=mp[cur-targetsum];
        }
        mp[cur]+=1;
        cnt+=dfs(root->left,cur,targetsum);
        cnt+=dfs(root->right,cur,targetsum);
        mp[cur]--;
        return cnt;
    }
    
    
    int pathSum(TreeNode* root, int targetSum) {
        if(root==nullptr)
            return 0;
        mp[0]=1;
        int cnt=dfs(root,0,targetSum);
        return cnt;
    }
private:
    map<int,int>mp;
};

版权声明:本文为m0_66776925原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。