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