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]
]
就是求一个数组的全排列数组。
思路:回溯法
在 LeetCode:31. Next Permutation 的暴力求解法中已经实现过全排列的算法。以 [1,2,3] 为例,求[1,2,3] 的全排列,只要求得[1,2]的全排列数组,这里是[[1,2],[2,1]]然后再将3插入到每个数组的空隙,比如[3,1,2],[1,3,2],[1,2,3]。而求[1,2]的全排列也是同理。
class Solution:
def permutePart(self, nums: List[int]) -> List[List[int]]:
res = []
l = len(nums)
if l == 1:
res.append(nums)
else:
lastPermute = self.permutePart(nums[0:l-1])
if lastPermute is not None:
for last in lastPermute:
if last is not None:
ll = len(last)
for i in range(ll+1):
tmp = last[:]
tmp.insert(i,nums[l-1])
res.append(tmp)
return res
def permute(self, nums: List[int]) -> List[List[int]]:
p = self.permutePart(nums)
return p
对于这种思路,Discuss 中的一种简单写法。
class Solution:
def permute(self, nums):
perms = [[]]
for n in nums:
new_perms = []
for perm in perms:
for i in range(len(perm)+1):
new_perms.append(perm[:i] + [n] + perm[i:]) ###insert n
perms = new_perms
return perms
此外 47. Permutations II 对上面这个结果去重就可以了。
THE END.