题目
给出一组数字,返回该组数字的所有排列。
例如:
[1,2,3]的所有排列如下:
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].
(以数字在数组中的位置靠前为优先级,按字典序排列输出。)
数据范围:数字个数 0<n≤6。
要求:空间复杂度 O(n!),时间复杂度 O(n!)。
示例1
输入:[1,2,3]
返回值:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例2
输入:[1]
返回值:[[1]]
思路
可参考:
代码
import java.util.*;
public class Solution {
//返回的结果集
ArrayList<ArrayList<Integer>> res = new ArrayList<>(); //要放在方法外,否则会报错
public ArrayList<ArrayList<Integer>> permute(int[] num) {
//存一种排列
ArrayList<Integer> list = new ArrayList<>();
//递归进行
dfs(num, list);
return res;
}
private void dfs(int[] num, ArrayList<Integer> list) {
//当list中的长度等于数组的长度,则证明此时已经找到一种排列了
if (list.size() == num.length) {
//添加进返回的结果集中
res.add(new ArrayList<>(list));
return;
}
//遍历num数组
for (int i = 0; i < num.length; i++) {
//若当前数组中的元素已经添加过了则跳过
if (list.contains(num[i])) {
continue;
} else { //当前数组中的元素还没添加过
list.add(num[i]); //选择该数
dfs(num, list); //继续寻找
list.remove(list.size() - 1); //撤销刚才假如的值,准备下一次遍历
}
}
}
}