刷题437. Path Sum III

Posted siweihz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题437. Path Sum III相关的知识,希望对你有一定的参考价值。

一、题目说明

题目437. Path Sum III,给定一个二叉树和整数sum,计算路径和是sum的数量,其中路径只能是从父节点向下的。难度是Easy!

二、我的解答

这个题目绝对不是Easy!最直观的想法,先判断根节点是否有路径,然后判断左子树,右子树是否有路径。

class Solution{
	public:
		int pathSum(TreeNode* root,int sum){
			if(root==NULL) return 0;
			return dfs(root,sum) + pathSum(root->left,sum) + pathSum(root->right,sum);
		}
		int dfs(TreeNode* root,int sum){
			//以root为起点,任意节点可作为结束和为sum的个数 
			if(root==NULL) return 0;
			
			sum = sum - root->val; 
			int cur = sum==0? 1: 0;
			
			return cur + dfs(root->left,sum) + dfs(root->right,sum);
		}
};

性能如下:

Runtime: 24 ms, faster than 49.38% of C++ online submissions for Minimum Path Sum.
Memory Usage: 14.6 MB, less than 50.00% of C++ online submissions for Minimum Path Sum.

三、优化措施

网上找了一个dp算法:这个题目类似数组求连续和,将递归算法消除一层递归!

class Solution{
	public:
		// dp solution 
		int pathSum(TreeNode* root,int sum){
			if(root==NULL) return 0;
			sums.resize(maxDepth(root)+1,0);
			dfs(root,1,sum);
			return count;
		}
		int maxDepth(TreeNode* root){
			if(root==NULL) return 0;
			return max(maxDepth(root->left),maxDepth(root->right))+1;
		}
		void dfs(TreeNode* root,int level,int sum){
			if(root==NULL) return;
			
			sums[level] = sums[level-1] + root->val;
			for(int i=0;i<level;i++){
				if(sums[level]-sums[i]==sum) count++;
			}
			dfs(root->left,level+1,sum);
			dfs(root->right,level+1,sum);
		}
	private:
		int count = 0;
		vector<int> sums;
};

性能如下:

Runtime: 20 ms, faster than 77.01% of C++ online submissions for Path Sum III.
Memory Usage: 14.6 MB, less than 100.00% of C++ online submissions for Path Sum III.

以上是关于刷题437. Path Sum III的主要内容,如果未能解决你的问题,请参考以下文章

437. Path Sum III

437. Path Sum III

437. Path Sum III

437. Path Sum III

437. Path Sum III

LeetCode 437. Path Sum III