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%了。。。。就这样吧