---
tags: Leetcode
---
# 回溯
---
[46. 全排列](https://leetcode-cn.com/problems/permutations/)
:::spoiler Python
```python=
import copy
# 递归实现:仅使用 start end 和 交换
def permutation(ls: list) -> list:
res = []
def recur(start, end):
if start >= end:
res.append(ls[:])
return
for idx in range(start, end):
ls[start], ls[idx] = ls[idx], ls[start] # 将选择过的 item 交换到前面
recur(start + 1, end) # 下一次迭代就不包含上一次选择过的 item
ls[start], ls[idx] = ls[idx], ls[start]
recur(0, len(ls))
return res
# 递归实现 2:将 list 传递
def permutation2(ls: list) -> list:
res = []
def recur(l: list, reduce: list):
if len(l) == 0:
res.append(reduce)
return
for idx in range(len(l)):
new = copy.copy(l) # 拷贝新 list
del new[idx]
recur(new, reduce + [l[idx]])
recur(ls, [])
return res
# 迭代实现:将 list 存入栈 / 队列
def permutation_iter(ls: list) -> list:
res = []
stack = [(ls, [])]
while stack:
l, reduce = stack.pop() # 队列也可
if len(l) == 0:
res.append(reduce)
continue
for idx in reversed(range(len(l))): # 不 reverse 也可
new = copy.copy(l)
del new[idx]
stack.append((new, reduce + [l[idx]]))
return res
```
:::
:::spoiler Java
```java=
class Solution {
ArrayList<List<Integer>> list = new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
fun(0,nums);
return list;
}
public ArrayList<List<Integer>> fun(int left,int []nums){
int n = nums.length;
if(left == n-1){
ArrayList<Integer> temp = new ArrayList<Integer>();
for(int i = 0; i < n; i++){
temp.add(nums[i]);
}
list.add(temp);
return list;
}
for(int i = left;i < n;i++){
swap(nums,left,i);
fun(left + 1,nums);
swap(nums,left,i);
}
return list;
}
public void swap(int [] nums,int i,int j){
// nums[i] = nums[i]^ nums[j];
// nums[j] = nums[i]^nums[j];
// nums[i] = nums[i]^nums[j];
int temp = nums[i];
nums[i]=nums[j];
nums[j] =temp;
}
}
```
:::
:::spoiler c
```
```
:::
---