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

  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/fangdai/p/7112300.html
Copyright © 2011-2022 走看看