给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
#从第一个数分别与后面的每个数进行交换后进行全排列直到最后一位
res = []
self.mute(nums, 0, res)
return res
def mute(self, nums, i, res):
if i == len(nums):
temp = []
for j in range(len(nums)):
temp.append(nums[j])
res.append(temp)
for j in range(i, len(nums)):
self.swap(nums, i, j)
self.mute(nums, i + 1, res)
self.swap(nums, i, j)
def swap(self, nums, i, j):
temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
另一种更简单的方法,依次固定第一个元素,前两个元素直到前N-1个元素,对后面的元素进行全排列。
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
#依次固定第一个、前两个元素直到最后一个元素,对后面的元素进行全排列
m = len(nums)
res = []
if m == 1:
return [nums]
if m == 0:
return [[]]
ans = self.permute(nums[1:])
n = len(ans)
for i in range(m):
for j in range(n):
temp = []
temp += ans[j][:i]
temp += [nums[0]]
temp += ans[j][i:]
res.append(temp)
return res

本文深入解析了全排列算法的两种实现方法:一种是通过交换元素进行递归全排列,另一种是固定部分元素并对剩余元素进行全排列。文章提供了详细的代码示例和解释,帮助读者理解并掌握全排列算法。
894

被折叠的 条评论
为什么被折叠?



