这次我正在研究组合和问题Leetcode。这是一个非常有趣的问题,就像这样。
给定一组候选数字(C)(没有重复)和目标数字(T),找到C中所有唯一的组合,其中候选数字总和为T.
可以从C无限次数中选择相同的重复数字。
注意:
例如,给定候选集[2, 3, 6, 7]
和目标7
,
解决方案集是:
[[7],[2, 2, 3]]
现在,我编写了以下算法,几乎可以解决我的目的。问题是我的算法没有删除重复项。让我告诉你如何:
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
candies = []
if target in candidates and len(candidates) ==1:
return [[target]]
for idx in range(len(candidates)):
residual = target
count =0
while residual >= candidates[idx]:
residual -= candidates[idx]
if candidates[idx] == target:
candies.append([candidates[idx]])
count += 1
if (residual in candidates and (residual-candidates[idx]) <= candidates[idx]):
candies.append([candidates[idx]]*count+[residual])
return candies
所以我们有一个名为candies
的结果列表(候选人的简称,超级糟糕的变量名称,但我之前没有认真对待这个问题)。
步骤:
如果我们只有一个候选者并将其作为列表列表返回,则第一个if
语句会检查基本情况。
我们遍历candidates
,在每次迭代时,我们将residual
初始化为目标,将count
初始化为零。 count
帮助我们跟踪我们重复调用相同数字的次数,然后在最后创建列表列表。 [candidates[idx]]*count+[residual]
。
最后一个内循环是一个while
循环,它迭代直到我们的残差大于或等于candidate[idx]
。因此,一次从candidates
中取出每个元素,并检查重复选择相同元素的总和是否达到目标。此外,'if'语句添加列表中的任何中间元素,并且可以成为candies
(结果集)。
因此部分地解决了这个问题。我的问题是我们得到相同的元素组合。这是如何做:
input: [2,3,6,7,1]
目标= 3
我们选择2
我们会重复选择它,直到我们residual
(7
)低于2
,我们选择2一次,然后搜索,然后选择1
。给我们[2,1]
但是进行1
检查。然后选择2
给我们[1,2]
这是一个重复的组合。怎么能解决这个问题?您可能会看到任何改进?
答案 0 :(得分:0)
对成功的子集进行排序。然后,在添加成功的子集之前,请检查它是否存在于成功的候选组合的集合中。
# suppose your target = 3
old_combinations = [[1,2]]
new_combination = [2, 1]
if sorted(new_combination) not in old_combinations:
old_combinations.append(sorted(new_combination))
print("found a unique combo!")
else:
pass