LeetCode 90. Subsets II 20170703

Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,2], a solution is:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

题目大意:给定一个可能含有重复数字的集合,返回所有可能的子集的集合

解题思路:本题跟之前做过的一道Leetcode78. Subsets非常相似。也是列出所有子集的集合,但是两题不同之处在于这个是升级版,是可能出现重复数字的。解题的方法应该还是用DFS来处理,只不过在处理重复数字上需要一些办法。一开始想到的做法是在深度优先的循环里做一个判断,如果集合中的当前数字跟他的前一个数字是一样的,那就跳过,不把该数字加入到子集中,直接进入循环的下一步。但是在运行的过程中出错了。原因是有可能会出现以下情况,就拿题目给的例子来说吧。如果子集中已有的数字是1,则nums集合中还剩下[2,2],如果按照nums[i]==nums[i-1]就跳出循环的话,在Python中nums[-1]等于该集合的最后一个元素,这种情况下第一个2被跳过,这样就无法出现子集[1,2,2]。后来经过尝试,增加一个判断,不仅是当前数字等于前一个数字,还要当前数字不是剩余数组中的第一个数字,才跳过,如果是第一个数字,就不跳过,这样就不会出现跳过第一个2的情况。

class Solution(object):
  def subsetsWithDup(self, nums):
  """
  :type nums: List[int]
  :rtype: List[List[int]]
  """
    A=[]
    def dfs(start, length, List):
      for i in range(start, len(nums)):
        if length == len(nums):
          return
        if nums[i] == nums[i - 1] and i!=start:
          continue
        else:
          A.append(List + [nums[i]])
        dfs(i + 1, length+1, List + [nums[i]])
    nums.sort()
    if not nums:
      return []
    else:
      A.append([])
      dfs(0, 0, [])
      return A

原文地址:https://www.cnblogs.com/fangdai/p/7112300.html