子集
题目描述
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
示例
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
分析
利用 回溯法子集树模板,调整参数传入
,并且无约束条件
即无冲突
。
代码
class Solution:
def __init__(self):
self.data = []
self.n = 0
self.tempRes = []
self.res = []
def conflict(self, k):
return False
def backtrack(self, k):
if k>=self.n:
self.res.append(self.tempRes[:])
else:
for i in [0, 1]:
if i == 1:
self.tempRes.append(self.data[k])
if not self.conflict(k):
self.backtrack(k+1)
if i == 1:
self.tempRes.pop()
def subsets(self, nums: List[int]) -> List[List[int]]:
self.data = nums
self.n = len(nums)
self.backtrack(0)
return self.res
子集II
题目描述
给定一个可能包含重复元素
的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:
解集不能
包含重复的子集。
示例
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
分析
事实上,还是求子集,利用 回溯法子集树模板 ,先排序
,求得所有子集后,去重
即可。
代码
class Solution:
def __init__(self):
self.data = []
self.n = 0
self.tempRes = []
self.res = []
def conflict(self, k):
return False
def backtrack(self, k):
if k>=self.n:
self.res.append(tuple(self.tempRes))
else:
for i in [0, 1]:
if i == 1:
self.tempRes.append(self.data[k])
if not self.conflict(k):
self.backtrack(k+1)
if i == 1:
self.tempRes.pop()
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
self.data = sorted(nums)
self.n = len(nums)
self.backtrack(0)
return set(self.res)