78.子集
class Solution(object):
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
path = []
res = []
def backtracking(nums, startindex):
res.append(path[:])# 收集子集,要放在终止添加的上面,否则会漏掉自己 含有空集
'''
如果放在终止条件里面会漏掉
[[1,2,3],[1,3],[2,3],[3]]
[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
'''
if startindex >= len(nums):
return
for i in range(startindex, len(nums)):
path.append(nums[i])
backtracking(nums, i + 1)
path.pop()
backtracking(nums,0)
return res
90.子集II
class Solution(object):
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 去重 参考三数之和 树层去重 树枝可重
nums.sort()
path = []
res = []
def backtracking(nums, startindex):
res.append(path[:])# 收集子集,要放在终止添加的上面,否则会漏掉自己 含有空集
if startindex >= len(nums):
return
for i in range(startindex, len(nums)):
if i > startindex and nums[i] == nums[i-1]:
continue
path.append(nums[i])
backtracking(nums, i + 1)
path.pop()
backtracking(nums,0)
return res
491. 递增子序列
重点:
同一父节点下的同层上使用过的元素就不能在使用了
同事当前元素不能小于序列中的最后一个元素
使用一个数组或set来记录是否使用过该元素
used是记录本层元素是否重复使用,新的一层used都会重新定义(清空),所以要知道used只负责本层!
class Solution(object):
def findSubsequences(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 因为要求自递增 所以不能排序改变序列
path = []
res = []
def backtracking(nums, startindex):
# 收集子集,要放在终止添加的上面,否则会漏掉自己 同时要求至少两个元素 所以path长度至少为2
if len(path) >= 2:
res.append(path[:])
if startindex >= len(nums):
return
used = set()# 使用set对本层元素进行去重
for i in range(startindex, len(nums)):
# 若当前元素值小于前一个时(非递增)或者曾用过,跳入下一循环
if (path and nums[i] < path[-1]) or nums[i] in used :
continue
used.add(nums[i])
path.append(nums[i])
backtracking(nums, i + 1)
path.pop()
backtracking(nums,0)
return res