2016-09-14 3 views
2

私はleetcode上でこの問題を働いています:参照または値によるPython再帰パス?

Given a set of distinct integers, nums, return all possible subsets. 
input =[1,2,3] 
output =[[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]] 

私は受け入れられているC++のソリューションを、持っている、そして私は、まったく同じのpythonソリューションをコード化されました。

class Solution(object):  
    def subsets(self, nums): 
     """ 
     :type nums: List[int] 
     :rtype: List[List[int]] 
     """ 
     solutions = [] 
     self._get_subset(nums, 0, [], solutions) 

     return solutions 

    @staticmethod 
    def _get_subset(nums, curr, path, solutions): 
     if curr>= len(nums): 
      solutions.append(path) 
      return 

     path.append(nums[curr]) 
     Solution._get_subset(nums, curr+1, path, solutions) 

     path.pop() 
     Solution._get_subset(nums, curr+1, path, solutions) 

出力は以下のようになります。 [[]、[]、[]、[]、[]、[]、[]、[]]

Pythonが通り過ぎるようです参照/問題の原因となる値渡し、しかし私はどのように把握することはできません。同じC++コードは大丈夫作品:

class Solution { 
public: 
vector<vector<int>> subsets(vector<int>& nums) { 
    vector<vector<int>> solutions; 
    vector<int> path; 

    _get_path(nums, 0, path, solutions); 
    return solutions; 
} 

void _get_path(vector<int>& nums, 
       int curr, 
       vector<int>& path, 
       vector< vector<int> > &solutions) 
{ 
    if(curr >= nums.size()){ 
     solutions.push_back(path); 
     return; 
    } 
    path.push_back(nums[curr]); 
    _get_path(nums, curr+1, path, solutions); 

    path.pop_back(); 
    _get_path(nums, curr+1, path, solutions); 
} 
}; 
+1

'PATH'が参照によって渡されるので、あなたは常にだけで同じインスタンスを操作しています。あなたが変更できるコピーを渡すために 'path [:]'を渡す – njzk2

答えて

4

問題はここにある:C++での

solutions.append(path) 

vector::push_backは(内部)pathのコピーを作成します。しかし、Pythonではすべてが参考になります。したがって、solutionsを同じpathへの多くの参照のリストとして構築すると、最終的には無駄になります。

solutions.append(list(path)) 

か::

あなたがコピーをしたい

solutions.append(path[:]) 
関連する問題