【发布时间】:2017-02-07 15:16:28
【问题描述】:
这次我正在研究组合和问题 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],这是一个重复的组合。如何解决这个问题?您可能会看到任何改进?
【问题讨论】:
-
设置我的朋友 -- 使用设置
-
@dawg 是的,是的,我知道解决方法,但是如果我们遇到这种情况怎么办? (我同意,集合在 python 中的效率要高得多。)在追加之前我们能找到任何其他检查吗?
-
查看这篇关于 Python 中有序集的帖子,并考虑在添加新结果之前实施简单的成员资格测试:stackoverflow.com/questions/1653970/…
标签: arrays algorithm python-3.x