LeetCode 0046. Permutations全排列【Medium】【Python】【回溯】【DFS】
Problem
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
问题
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路
解法一
permutations函数
Python3代码
from itertools import permutations
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
# solution one: permutations
return list(permutations(nums))
解法二
递归
已有的排列放入 path 中,当 nums 为空表示递归完成,再把 path 放入 res 中。
Python3代码
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
# solution two: recursion
res = []
self.dfs(nums, res, [])
return res
def dfs(self, nums, res, path):
if not nums:
res.append(path)
else:
for i in range(len(nums)):
self.dfs(nums[:i] + nums[i + 1:], res, path + [nums[i]])
解法三
回溯
visited 数组表示是否访问过这个位置。
Python3代码
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
# solution three: backtracking
visited = [0] * len(nums)
res = []
def dfs(path):
if len(path) == len(nums):
res.append(path)
else:
for i in range(len(nums)):
if not visited[i]:
visited[i] = 1
dfs(path + [nums[i]])
visited[i] = 0
dfs([])
return res