Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Example
Example 1:
Input: [0]
Output:
[
[],
[0]]
Example 2:
Input: [1,2,2]
Output:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]]
Challenge
Can you do it in both recursively and iteratively?
Notice
Each element in a subset must be in non-descending order.
The ordering between two subsets is free.
The solution set must not contain duplicate subsets.
    def subsetsWithDup(self, nums):
        # write your code here
        # no recursion
        if len(nums) == 0:
            return [[]]
        nums.sort()
        pre1 = [[]]
        pre2 = [[nums[0]]]
        preitem = nums[0]
        for index in range(1, len(nums)):
    
            if nums[index] == preitem:
                pre1 = pre1 + pre2
                pre2 = [i + [nums[index] ] for i in pre2]
            else:
                pre1 = pre1 + pre2
                pre2 = [i + [nums[index] ] for i in pre1]
            preitem = nums[index]
        return pre1 + pre2
    def subsetsWithDup(self, nums):
        res = []
        nums.sort()
        self.dfs(nums, 0, [], res)
        return res
    def dfs(self, nums, index, path, res):
        res.append(path)
        for i in range(index, len(nums)):
            if i > index and nums[i] == nums[i-1]:
                continue
            self.dfs(nums, i+1, path+[nums[i]], res)
class Solution:
    # @param num, a list of integer
    # @return a list of lists of integer
    def subsetsWithDup(self, S):
        res = [[]]
        S.sort()
        for i in range(len(S)):
            if i == 0 or S[i] != S[i - 1]:
                l = len(res)
            for j in range(len(res) - l, len(res)):
                res.append(res[j] + [S[i]])
        return res除去了额外的存储空间
DFS
[1,2,2]为例子,

[Lintcode]18. Subsets II/[Leetcode]90. Subsets II
原文:https://www.cnblogs.com/siriusli/p/10386556.html