NO46. 全排列
#考察回溯,[1,2,3,4]->1+[2,3,4]->1+2+[3,4]
# ->1+3+[2,4]...
# 之后重置往前返回
#也类似深度优先遍历,把每层的最深一层找到然后返回,再重复操作
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
def backtrack(nums,tmp):
if not nums:
#利用set的属性
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
return list(set(list(itertools.permutations(nums))))
NO47. 全排列 II
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
nums.sort() # 将相同的元素放到一起
self.res = [] #定义返回空列表
check = [0 for i in range(len(nums))] #生成len(nums)个的数组,用0占位
self.backtrack([], nums, check) #初始化
return self.res
def backtrack(self, sol, nums, check):
if len(sol) == len(nums): #回溯的条件,添加sol
self.res.append(sol)
return
for i in range(len(nums)):
if check[i] == 1: #遍历完成check判断
continue
if i > 0 and nums[i] == nums[i-1] and check[i-1] == 0: # check[i-1] == 0 表示在该路径下遍历相同元素(不同的索引)的时候该元素已经取过了
continue
check[i] = 1
self.backtrack(sol+[nums[i]], nums, check) #需要添加当前的遍历元素
check[i] = 0
res.append(tmp)
return
for i in range(len(nums)):
backtrack(nums[:i]+nums[i+1:],tmp+[nums[i]]) #回溯,nums此时已经改变需要重新整理,其tmp参数得需要重新添加当前数组
backtrack(nums,[]) #初始化
return res
#直接调用函数内部的库,效率高
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
return list(itertools.permutations(nums))