代码随想录算法训练营Day 29| 回溯算法part05 | 491.递增子序列、46.全排列、47.全排列 II
文章目录
491.递增子序列
一、set去重
class Solution(object):
def findSubsequences(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result =[]
# nums.sort()
self.backtracking(nums,[],result,0)
return result
def backtracking(self,nums,path,result,startindex):
uset = set()
if len(path)>=2:
result.append(path[:])
for i in range(startindex,len(nums)):
if nums[i] in uset:
continue
if not path or (path and nums[i] >=path[-1]):
uset.add(nums[i])
path.append(nums[i])
self.backtracking(nums,path,result,i+1)
path.pop()
在90.子集II (opens new window)中我们是通过排序,再加一个标记数组来达到去重的目的。
而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。
所以不能使用之前的去重逻辑!
46.全排列
一、used去重
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = []
used=[0]*len(nums)
self.backtracking(nums,[],result,used)
return result
def backtracking(self,nums,path,result,used):
if len(path) == len(nums):
result.append(path[:])
return
for i in range(len(nums)):
if used[i]==0:
path.append(nums[i])
used[i]= 1
self.backtracking(nums,path,result,used)
path.pop()
used[i] = 0
每层都是从0开始搜索而不是startIndex
需要used数组记录path里都放了哪些元素了
47.全排列 II
一、used去重
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
used=[0]*len(nums)
nums.sort()
result=[]
self.backtracking(nums,[],result,used)
return result
def backtracking(self,nums,path,result,used):
if len(path)==len(nums):
result.append(path[:])
return
for i in range(len(nums)):
# 树层去重
if i>0 and nums[i]==nums[i-1] and used[i-1]==0:
continue
# 树枝去重,不取之前取过的数
if used[i] ==0:
path.append(nums[i])
used[i]=1
self.backtracking(nums,path,result,used)
path.pop()
used[i]=0