问题描述:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
问题分析:
使用回溯法,我们每次选择一个数出来,然后把剩下的数,再选择一个出来,依次类推,选到头,就回溯到上一层。其实仔细想想就是深度优先搜索方法。
Python3递归实现:
# @Time :2018/7/12
# @Author :LiuYinxing
# 回溯法,递归,深度优先搜索
class Solution:
def permute(self, nums): # 递归方法实现
res = []
def dfs(nums, path, res):
if not nums: # 选到头,添加到res中,这里是递归出口,可以加return也可以不加,后续一定会结束。
res.append(path)
for i in range(len(nums)): # 每次选择一个深度选取
dfs(nums[:i]+nums[i+1:], path+[nums[i]], res)
dfs(nums, [], res)
return res
def permute1(self, nums): # 递归方法改进,明显比第一种方法要快很多。
res = []
def dfs(nums=nums, path=[]):
if not nums: # 选到头,添加到res中,这里是递归出口,可以加return也可以不加,后续一定会结束。
res.append(path)
for i in range(len(nums)): # 每次选择一个深度选取
dfs(nums[:i]+nums[i+1:], path+[nums[i]])
dfs()
return res
if __name__ == '__main__':
solu = Solution()
print(solu.permute(nums=[1, 2, 3]))
Python3库函数实现:
# @Time :2018/7/12
# @Author :LiuYinxing
# 使用Python自带的库函数,三种方法都可以AC
import itertools
class Solution:
def permute(self, nums): # 库函数实现
return [*itertools.permutations(nums)]
def permute1(self, nums): # 库函数实现
return list(itertools.permutations(nums))
def permute2(self, nums): # 库函数实现
return list(map(list, itertools.permutations(nums)))
if __name__ == '__main__':
solu = Solution()
print(solu.permute1(nums=[1, 2, 3]))
欢迎指正哦。