关于 LeetCode-39 的问题:'Combination Sum'

Question about LeetCode-39 : 'Combination Sum'

测验 39. 给定一组不同的整数候选和一个目标整数目标,return 候选的所有唯一组合的列表,其中所选数字总和为目标。您可以 return 任意顺序组合。

可以无限次地从候选人中选择相同的数字。如果至少一个所选数字的频率不同,则两个组合是唯一的。

对于给定的输入,保证总计为目标的唯一组合的数量少于 150 个组合。

ex) [2,3,5] , 8 -> [2,2,2,2], [2,3,3], [3,5]

我使用深度优先算法递归地为此测验编写了 python 代码,这与正确答案相似,但略有不同。 我写的东西不能正常工作。 我的答案和正确答案只有一处不同,我找不到我的错误原因。

def combinationSum(candidates, target: int): # cnadidates : [2,3,5], target = 8
    
    result = []

    def dfs(index : int, path : list, remain : int):

        if remain < 0: # failed to find, prune this path!
            return
        
        if remain == 0: # successed!
            result.append(path)
            return

        ''' my code - wrong
        path += [candidates[index]]
        remain -= candidates[index]

        for i in range(index, len(candidates)):
            dfs(i, path, remain)
        '''

        ''' correct answer
        for i in range(index, len(candidates)):
            dfs(i, path + [candidates[i]], remain - candidates[i])
        '''
        
    dfs(0, [], target)

    return result


r = combinationSum([2,3,5] , 8)
print(r)

你的代码有几个问题: += 就地更改列表,这与 path+[something] 有很大不同。虽然可能,但在递归调用中通常不希望这样做。 您的代码总是减去 candidates[index] 而正确答案动态地减去 candidates[i]