zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    数组的基本操作
    面向对象
    继承
    JavaBean规范
    JVM内存模型
    数组的排序
    this
    访问控制权限
    数组
    方法的重载
  • 原文地址:https://www.cnblogs.com/fangdai/p/7112300.html
Copyright © 2011-2022 走看看