class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def backtrack(nums,start):
res.append(path[:])
if start>=len(nums):#不写也行,因为要遍历整个树。
return
for i in range(start,len(nums)):
path.append(nums[i])
backtrack(nums,i+1)
#res.append(path[:])
path.pop()
backtrack(nums,0)
return res
'''遍历整个树,把结点都记录下来,就是所有子集的集合'''
90
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def backtrack(nums,start):
res.append(path[:])
for i in range(start,len(nums)):
if i>start and nums[i]==nums[i-1]:
continue
path.append(nums[i])
backtrack(nums,i+1)
path.pop()
nums=sorted(nums)
backtrack(nums,0)
return res
'''注意同层去重,但是不需要树枝去重。这题是78和40题的整合版。注意同层去重要排序。'''
不可以用sorted去重,因为本身是求递增子集。所以采用map法来记录一下。
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def backtrack(nums,start):
repeat=[]#用来记录是否同层有重复使用某个值。
if len(path)>1:#要求子序列是最小长度为2
res.append(path[:])
#注意这里不要加return因为我们要取书上所有结点。
for i in range(start,len(nums)):
if nums[i] in repeat:#说明重复,跳过
continue
if len(path)>=1:#我们下一步是要把num[i]加入path,在此之前我们要先判断,这个即将加入的数,是不是比path中最后一位小,如果小,跳过
if nums[i]<path[-1]:
continue
repeat.append(nums[i])
path.append(nums[i])
backtrack(nums,i+1)
path.pop()
backtrack(nums,0)
return res
这几个题都可以不用加return。