close

這個題目... 是有一題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

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 頁頁頁六滴 的頭像
    頁頁頁六滴

    人森很精彩,所以要把所有事情都記起來=ˇ=

    頁頁頁六滴 發表在 痞客邦 留言(0) 人氣()