目前我正在处理Leetcode Problem 39组合和,并试图用C ++和Python来解决它。
算法是一个基本的DFS,我的问题是关于dfs部分。当我用C ++将代码复制到Python时,它似乎不起作用。以下是Python中的self.dfs部分:
dfs(self, candidates, target, start, comb, res):
if target == 0:
res.append(comb)
elif target < 0:
return
else:
for i in range(start, len(candidates)):
comb.append(candidates[i])
self.dfs(candidates, target-candidates[i], i, comb, res)
comb.pop()
在这段代码中,我在res中得到了空列表。然而,如果我将最后一个“其他”部分改为:
for i in range(start, len(candidates)):
self.dfs(candidates, target-candidates[i], i, comb+[candidates[i]], res)
确实有效。
所以我想知道它可能是Python和C ++之间的区别,也许是使用引用?有谁能搞清楚?
为方便起见,我还在这里附上C ++代码:
void dfs(vector<vector<int>>& candidates, int target, int i, vector<int>& comb, vector<vector<int>>& res){
if (target < 0)
return;
else if (target == 0)
res.push_back(comb);
else{
for (int i=start; i<candidates.size(); ++i){
comb.push_back(candidates[i]);
dfs(candidates, target-candidates[i], i, comb, res);
comb.pop_back();
}
}
}
答案 0 :(得分:0)
在您的C ++代码中,执行以下操作:
res.push_back(comb);
您正在复制comb
的数据(因为res
是&#34;列表&#34;&#34;列表&#34;整数),即使{ {1}}作为参考传递。
在你的python代码(第一个代码片段)中,你永远不会复制,所以comb
的所有元素都是相同的列表。为了相同,您可以这样做:
res
或
res.append(list(comb))
您的修复(在递归调用函数时传递副本)可以正常工作,但即使不需要也会复制。您只需要在追加到res.append(comb[:])
(重现&#34; bug&#34;在C ++中你必须在向量指针上创建一个向量并存储res
的地址,这样就不会复制了)