10.10(112. 路径总和 113. 路径总和 II)

112. 路径总和

思路:递归

效率:11.69%。哎,好低。。。20ms

程序代码:

class Solution {
 public:
	 bool hasPathSum(TreeNode* root, int sum) {
		 if (root == NULL) return false;
         else if(root->left==NULL&&root->right==NULL&&sum==root->val) return true;
		 return hasPathSum(root->left, sum - root->val) || hasPathSum(root->right,sum-root->val);
	 }
 };

以下是用时4ms的程序代码,大家的思路都是差不多的,为什么这个答案就可以省时间呢。。。最后的部分并不是个很懂。。

class Solution {
public:
    bool hasPathSum(TreeNode* root, int sum) {
	if (root == NULL)
		return false;
	if (root->left == NULL&&root->right == NULL)
		return sum == root->val;
	if (root->left != NULL)
		if (hasPathSum(root->left, sum - root->val))
			return true;
	if (root->right != NULL)
		if (hasPathSum(root->right, sum - root->val))
			return true;
	return false;
}

};
static const auto io_speed_up = []()
{
	std::ios::sync_with_stdio(false);
	cin.tie(nullptr);
	return 0;
}();

113. 路径总和 II

思路:递归

效率:5.85%

程序代码():

解法1(我的):

class Solution {
 public:
	 vector<vector<int>> pathSum(TreeNode* root, int sum) {
		 vector<vector<int>> result;
		 vector<int> vec;
		 Haha(result,vec,root,sum);
		 return result;
	 }
	 void Haha(vector<vector<int>> &result, vector<int> vec, TreeNode* root, int sum) {
		 if (root == NULL) return;
		 else if (sum == root->val&&root->left == NULL && root->right == NULL) {
			 vec.push_back(root->val);
			 result.push_back(vec);
		 }
		 else if (sum != root->val&&root->left == NULL && root->right == NULL) return;
		 else {
			 vec.push_back(root->val);
			 Haha(result,vec,root->left,sum-root->val);
			 Haha(result,vec,root->right,sum-root->val);
		 }
	 }
};

提交了好几次,终于可以成功运行了。
但是经过研究发现如果只是把向量从普通的复制改成转移引用,那么效率会变成60+%。时间是12ms,看来复制很浪费时间。。。。

更改之后的程序:

解法二(受答案启发更改的):

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
 public:
	 vector<vector<int>> pathSum(TreeNode* root, int sum) {
		 vector<vector<int>> result;
		 vector<int> vec;
		 Haha(result,vec,root,sum);
		 return result;
	 }
	 void Haha(vector<vector<int>> &result, vector<int> &vec, TreeNode* root, int sum) {
		 if (root == NULL) return;
		 else if (sum == root->val&&root->left == NULL && root->right == NULL) {
			 vec.push_back(root->val);
			 result.push_back(vec);
             vec.pop_back();
		 }
		 else if (sum != root->val&&root->left == NULL && root->right == NULL) return;
		 else {
			 vec.push_back(root->val);
			 Haha(result,vec,root->left,sum-root->val);
			 Haha(result,vec,root->right,sum-root->val);
			 vec.pop_back();
		 }
	 }
};

作为一个追求完美的人,必须得再进一步提高效率!!!加油!!

再对逻辑稍微进行更改之后,时间变成了8ms。

解法三(受答案启发更改了逻辑):

class Solution {
 public:
	 vector<vector<int>> pathSum(TreeNode* root, int sum) {
		 vector<vector<int>> result;
		 vector<int> vec;
		 Haha(result,vec,root,sum);
		 return result;
	 }
	 void Haha(vector<vector<int>> &result, vector<int> &vec, TreeNode* root, int sum) {
		 if (root == NULL) return;
         vec.push_back(root->val);
		 if (sum == root->val&&root->left == NULL && root->right == NULL) {
			 result.push_back(vec);
             vec.pop_back();
		 }
		 else {
			 Haha(result,vec,root->left,sum-root->val);
			 Haha(result,vec,root->right,sum-root->val);
			 vec.pop_back();
		 }
	 }
};

用时4ms的超强答案在此(参考答案)

解法四(标准答案,抄的);

class Solution {
public:
    vector<vector<int>> routes;
    vector<int> rt;
    int node_add;
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        //int node_add = 0;
        transfer(root, rt, sum);
        return routes;
        
    }
    void transfer(TreeNode* root, vector<int> &rt, int &sum){
        if (!root){
            return;                
        }
       
        rt.push_back(root->val);
        node_add += root->val;
         if (!root->left && !root->right){
            if (node_add == sum)
                routes.push_back(rt);
        }
       // if (!root->left)
            transfer(root->left, rt, sum);
       // if (!root->right)
            transfer(root->right, rt, sum);
        rt.pop_back();
        node_add -= root->val;
    }
    
};

她的逻辑和前一个解法的逻辑是一样的,但是sum使用的是引用,而不是复制传值。可能是这一点节省了时间,对解法三进行相同思路的更改,看看效率会如何变化。

解法五(受标准答案启发更改):

效率:99.73%,但是还不是100%。。。。。

class Solution {
 public:
	 vector<vector<int>> pathSum(TreeNode* root, int sum) {
		 vector<vector<int>> result;
		 vector<int> vec;
		 Haha(result,vec,root,sum);
		 return result;
	 }
	 void Haha(vector<vector<int>> &result, vector<int> &vec, TreeNode* root, int &sum) {
		 if (root == NULL) return;
         vec.push_back(root->val);
         sum-=root->val;
		 if (sum == 0&&root->left == NULL && root->right == NULL) {
			 result.push_back(vec);
             vec.pop_back();
             sum+=root->val;
		 }
		 else {
			 Haha(result,vec,root->left,sum);
			 Haha(result,vec,root->right,sum);
			 vec.pop_back();
             sum+=root->val;
		 }
	 }
};

我也不知道为什么最后为啥没法提升至100%了。。。。就这样吧

猜你喜欢

转载自blog.csdn.net/the_little_fairy___/article/details/82993251