• 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

  • 相关阅读:
    表单工具可以什么
    页面嵌套的方式展现报表
    EChars图类型
    SVG图类型
    JSP <c:import>和<jsp:include>区别【转】
    Servlet配置
    jsp的scope属性【转载】
    Cookie、Session【转载】
    page、request、session、application区别【转载】
    C++笔记------static 和 const 在类中用法
  • 原文地址:https://www.cnblogs.com/fangdai/p/7112300.html
Copyright © 2020-2023  润新知