【问题标题】:How to remove duplicates from a list of lists, having different orders如何从具有不同顺序的列表列表中删除重复项
【发布时间】:2017-02-07 15:16:28
【问题描述】:

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

给定一组候选数 (C)(不重复)和一个目标数 (T),找出 C 中候选数总和为 T 的所有唯一组合。

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

注意:

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

来源: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(结果集)。

从而部分解决问题。我的问题是我们得到相同的元素组合。就是这样: input: [2,3,6,7,1] 目标 = 3 我们选择2我们重复选择它直到我们的residual7)低于2,我们选择2一次然后搜索然后选择1。给我们[2,1],但当它转到1 时检查。然后选择2 给我们[1,2],这是一个重复的组合。如何解决这个问题?您可能会看到任何改进?

【问题讨论】:

  • 设置我的朋友 -- 使用设置
  • @dawg 是的,是的,我知道解决方法,但是如果我们遇到这种情况怎么办? (我同意,集合在 python 中的效率要高得多。)在追加之前我们能找到任何其他检查吗?
  • 查看这篇关于 Python 中有序集的帖子,并考虑在添加新结果之前实施简单的成员资格测试:stackoverflow.com/questions/1653970/…

标签: arrays algorithm python-3.x


【解决方案1】:

对您成功的子集进行排序。然后,在附加一个成功的子集之前,检查它是否存在于您的成功候选组合集合中。

# 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

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 2022-11-22
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    相关资源
    最近更新 更多