问题描述
Given a collection of distinct integers, return all possible permutations.
给定一组不同的整数,返回所有可能的排列。
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
Python 实现
实现一:递归实现。根据排列的数学定义,求一组整数的排列,可以看做是依次选出一个整数后,分别与去掉该整数后剩下的这一组整数排列的结果进行组合。这也是分治法的思想,把大问题逐层向下分解成小问题,每一层小问题的结果组合起来就能解答目标问题。因此我们可以定义一个递归函数,用于求输入数组的排列,具体见以下代码:
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
ret = []
def subPermute(nums, arr):
if nums == None or len(nums) == 0:
ret.append(arr)
return
for i in range(len(nums)):
subPermute(nums[:i] + nums[i+1:], arr+[nums[i]])
subPermute(nums, [])
return ret
实现二:迭代实现。能用递归实现的算法基本都可以写成迭代的形式,这里为了更好的理解,思路上稍微做一点调整。同样是分解成求子数组的排列,假设我们已经求出了某个子数组的排列,给到下一个新的整数时,新的子问题就是在当前的排列结果得到新的排列结果,那我们可以把这个新整数依次插入在每个排列的结果的不同位置,这样就能得到到达该整数时,排列的结果。
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if nums == None or len(nums) == 0:
return [[]]
ret = [[nums[0]]]
idx = 1
while idx < len(nums):
tmp = []
# Iterate each temperory permution result.
for perm in ret:
# Insert new number into each temperory permution result.
for i in range(idx+1):
tmp.append(perm[:i] + [nums[idx]] + perm[i:])
# Update the subpermution result and index.
ret = tmp
idx += 1
return ret