【发布时间】:2022-01-29 05:06:41
【问题描述】:
我正在研究 LeetCode 40. Combination Sum II
给定一组候选编号(candidates)和一个目标编号(target),找出候选编号之和等于target的所有唯一组合。
候选中的每个数字在组合中只能使用一次。
注意:解决方案集不得包含重复的组合。
我下面的代码一直有效,直到候选人集合变得太大,然后我得到“超出时间限制”。我认为所有的递归都创建了太多的循环。我显然可以复制教程来获得答案,但我试图弄清楚如何更新我的代码以使其工作,以便更好地了解递归的工作原理。
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
candidates.sort()
answers = []
strings = []
total = sum(candidates)
if total < target:
return []
def backtrack(total, array, index):
if total == 0:
string = ''
for each in array:
string += str(each)
if string not in strings:
answers.append(array)
strings.append(string)
return
if index >= len(candidates):
return
for each in range(index, len(candidates)):
backtrack(total - candidates[each], array + [candidates[each]], each + 1)
backtrack(total, array, each + 1)
backtrack(target, [], 0)
return answers
【问题讨论】:
标签: python algorithm recursion big-o backtracking