[Lintcode]18. Subsets II/[Leetcode]90. Subsets II
阿新 • • 發佈:2019-02-16
ref for arc topic 17. you free urn put
18. Subsets II/90. Subsets II
- 本題難度: Medium
- Topic: Search & Recursion
Description
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
別人的代碼
Recursion
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)
改進的非Recursion
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
除去了額外的存儲空間
思路
非循環
- 不存在重復元素:f(n) = 2*f(n-1)
- 存在重復元素的: (1,2,2‘)中(1,2)/(1,2‘),(2)/(2‘)是重復的,它們去掉該k個重復元素的f(n-k)
- []
1 . [] pre1 /[1] pre2 - [] [1] pre1 /[2] [1,2] pre2
2‘. [] [1] [2], [1,2] pre1/ [2,2],[1,2,2] pre2
2‘ [] [1] [2], [1,2] [2,2],[1,2,2] pre1 /[2,2,2] [1,2,2,2] pre2
循環
DFS
[1,2,2]為例子,
- 時間復雜度 O(2^n)
[Lintcode]18. Subsets II/[Leetcode]90. Subsets II