這個題目... 是有一題Path Sum的後續題目
不過說是後續題目,我覺得基本上可以視為是同一題...
可以看一下之前那一題:
http://yayaya6d.pixnet.net/blog/post/349997008-leetcode%E7%B4%80%E9%8C%84--112.%20Path%20Sum
這次是要找出所有的解然後存回去
這難道不能算是同一題嘛親XD
我就直接貼我寫的code了,基本上多了一些code,就是在找值的同時把值存起來,往上離開節點時要把值拿出來:
class Solution {
public:
vector<vector<int>> viRet;
void inorder(int target ,int sum, vector<int>& vi, TreeNode* root)
{
if (root == nullptr)
return;
vi.emplace_back(root->val); // 把這個節點的值存進去
inorder(target, sum + root->val, vi, root->left);
if (root->left == nullptr && root->right == nullptr
&& sum + root->val == target)
{
viRet.emplace_back(vi);
}
inorder(target, sum + root->val, vi, root->right);
vi.pop_back(); // 這邊就是要換分支了,把這個節點的值拿掉
}
vector<vector<int>> pathSum(TreeNode* root, int sum) {
vector<int> vi;
inorder(sum, 0, vi, root);
return viRet;
}
};
這邊有一個小地方,這次不用是push_back而是改用emplace_back
這兩個有什麼區別呢?
大致上就是push_back是用copy的方式複製一份資料放到vector中:
把臨時變數建出來(這邊會調用constructor)-->複製一份(調用複製函數)-->把複製出來那份放到vector中-->釋放本來那一份臨時變數
但其實中間複製的那一步是沒必要的,emplace_back就是省略複製這件事情,直接在vector中建構一個新的資料
這樣會比較節省資源和時間
貌似不只vector,很多容器在C++11都有加入這種概念
這又牽扯到右值左值的概念...,C++11真的難啊XD
找個機會來寫一篇記錄一下吧
這題就... 輕鬆地結束了
看來就算都是medium,還是有難的跟簡單的啊XD
但也有可能只是我剛好想到就是XD
留言列表