题目78:子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
思路:
组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点
解答:
方法一:回溯
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def tracebacking(nums,startidx):
nonlocal res,path
res.append(path[:])
for i in range(startidx,len(nums)):
path.append(nums[i])
tracebacking(nums,i+1)
path.pop()
tracebacking(nums,0)
return res
方法二:原始解答
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = [[]]
for i in nums:
res = res + [[i] + num for num in res]
return res
题目90:子集II
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
解答:
方法一:回溯
(1)同层去重
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def tracebacking(nums,startidx):
nonlocal res,path
res.append(path[:])
for i in range(startidx,len(nums)):
#同层去重
if i!=startidx and nums[i]==nums[i-1]:
continue
path.append(nums[i])
tracebacking(nums,i+1)
path.pop()
nums.sort()
tracebacking(nums,0)
return res
(2)使用uset去重,该去重是针对同一父节点的本层去重
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def tracebacking(nums,startidx):
nonlocal res,path
res.append(path[:])
uset=set()
for i in range(startidx,len(nums)):
if nums[i] in uset:
continue
uset.add(nums[i])
path.append(nums[i])
tracebacking(nums,i+1)
path.pop()
nums.sort()
tracebacking(nums,0)
return res
方法二:原始解答
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
res=[[]]
if not nums:
return res
nums.sort()
n=len(nums)
for i in range(n):
tmp=nums[i]
if i>=1 and nums[i]==nums[i-1]:
new_subset=[subset+[tmp] for subset in new_subset]
else:
new_subset=[subset+[tmp] for subset in res]
res+=new_subset
return res