def combinationSum2(self, candidates, target): candidates.sort() res =  def dfs(t, idx=0, path=): if t < 0: return # Backtrack (Not a valid path) if t == 0: res.append(path) return if t > 0: for i in range(idx, len(candidates)): c = candidates[i] if i != idx and c == candidates[i-1]: continue # Eliminates duplicates dfs(t-c, i+1, path+[c]) dfs(target) return res
DFS idea is borrowed from @caikehe's Combination Sum solution. Here, when recursively calling dfs in for loop, we increment the index by 1 (unlike combination sum problem where we don't increment i). That's because we don't want the same number to be considered twice. Also, the line
if i != idx and c == candidates[i-1]: continue, is needed to eliminate duplicate combinations.