問題描述
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