###### tags: `Leetcode` `medium` `backtracking` `python` `Top 100 Liked Questions`
# 46. Permutations
## [題目連結:] https://leetcode.com/problems/permutations/
## 題目:
Given an array ```nums``` of distinct integers, return all the possible permutations. You can return the answer in **any order**.
**Example 1:**
```
Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
```
**Example 2:**
```
Input: nums = [0,1]
Output: [[0,1],[1,0]]
```
**Example 3:**
```
Input: nums = [1]
Output: [[1]]
```
## 解題想法:
兄弟題目: [47. Permutations II](/IL-bgYWuSIm8ohc5nKqsCw)
* 題目為: 給一數組,求其所有的排列組合
## Python: (Sol1)
* 遞迴求解:
* pos紀錄當前的位置,分別對於pos後面的位置與pos交換,遞迴求解
``` python=
class Solution:
def permute(self, nums):
#遞歸函數
self.res = []
self.dfs(nums, 0, [])
return self.res
def dfs(self,nums,pos,path):
#交換位置是最後那麼已完成當前排列
if pos == len(nums):
self.res.append(path)
return
for i in range(pos, len(nums)):
#i與pos交換
nums[i], nums[pos] = nums[pos], nums[i]
#進入遞歸
self.dfs(nums, pos + 1, path+[nums[pos]])
#遞歸完成i與pos交換回來
nums[i], nums[pos] = nums[pos], nums[i]
if __name__ == '__main__':
result = Solution()
ans = result.permute(nums = [1,2,3])
print(ans)
```
## Python: (Sol2)
* Recursive:
* 選pos輪流當頭,配上nums去掉nums[pos]後進行遞迴
``` python=
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
#init
res=[]
if len(nums)==0 or len(nums)==1:
res.append(nums)
return res
#遞迴找去掉pos之num
for pos in range(len(nums)):
#nums[:pos] + nums[pos+1:]->移除nums[pos]的元素
for val in self.permute(nums[:pos]+nums[pos+1:]):
res.append([nums[pos]]+val)
return res
if __name__ == '__main__':
result = Solution()
ans = result.permute(nums = [1,2,3])
print(ans)
```
## Python: Sol3
參考 [47. Permutations II](/IL-bgYWuSIm8ohc5nKqsCw) 概念
``` python=
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
self.res=[]
visited=[False]*len(nums) #紀錄該位置是否拜訪過
self.dfs(nums,[],visited)
return self.res
def dfs(self,nums,path,visited):
if len(path)==len(nums):
self.res.append(path)
return
for i in range(len(nums)):
if visited[i]: #若該位置已經訪問過,跳過
continue
visited[i]=True
self.dfs(nums,path+[nums[i]],visited)
visited[i]=False
```