如何从列表列表中删除重复项,具有不同的订单

时间:2017-02-07 15:16:29

标签: arrays algorithm python-3.x

这次我正在研究组合和问题Leetcode。这是一个非常有趣的问题,就像这样。

给定一组候选数字(C)(没有重复)和目标数字(T),找到C中所有唯一的组合,其中候选数字总和为T.

可以从C无限次数中选择相同的重复数字。

注意:

  1. 所有数字(包括目标)都是正整数。
  2. 解决方案集不得包含重复的组合。
  3. 来源:Leetcode: Combination sum

    例如,给定候选集[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的结果列表(候选人的简称,超级糟糕的变量名称,但我之前没有认真对待这个问题)。

    步骤:

    1. 如果我们只有一个候选者并将其作为列表列表返回,则第一个if语句会检查基本情况。

    2. 我们遍历candidates,在每次迭代时,我们将residual初始化为目标,将count初始化为零。 count帮助我们跟踪我们重复调用相同数字的次数,然后在最后创建列表列表。 [candidates[idx]]*count+[residual]

    3. 最后一个内循环是一个while循环,它迭代直到我们的残差大于或等于candidate[idx]。因此,一次从candidates中取出每个元素,并检查重复选择相同元素的总和是否达到目标。此外,'if'语句添加列表中的任何中间元素,并且可以成为candies(结果集)。

    4. 因此部分地解决了这个问题。我的问题是我们得到相同的元素组合。这是如何做: input: [2,3,6,7,1]目标= 3 我们选择2我们会重复选择它,直到我们residual7)低于2,我们选择2一次,然后搜索,然后选择1 。给我们[2,1]但是进行1检查。然后选择2给我们[1,2]这是一个重复的组合。怎么能解决这个问题?您可能会看到任何改进?

1 个答案:

答案 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