package leetCode.DP;
import java.util.ArrayList;
import java.util.List;
class lc_dp_46_permute {
/*
题目:
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路:
回溯和深度遍历dfs
dfs:看成是一棵树,不断往下探,记录路径path,到底后就加入结果接res,再一个个弹出结点
*/
public List<List<Integer>> permute(int[] nums) {
ArrayList<List<Integer>> res = new ArrayList<>();
if (nums == null || nums.length == 0)
return res;
boolean[] isVisited = new boolean[nums.length];
// 深度从0开始,一开始是为0的
dfs(nums, res, new ArrayList<Integer>(), isVisited, 0);
return res;
}
public void dfs(int[] nums, ArrayList<List<Integer>> res, ArrayList path,
boolean[] isVisited, int depth) {
if (depth == nums.length)//深度为数组长度时,到底加入结果集
res.add(new ArrayList<>(path));
for (int i = 0; i < nums.length; i++) {
if (isVisited[i])//如果已经访问过,则跳过这次
continue;
path.add(nums[i]);//否则加入路径并置为已访问
isVisited[i] = true;
//继续寻找并加入下一个数
dfs(nums, res, path, isVisited, depth + 1);
// 该数结束后就从路径中弹出并置为未访问,换成别的数,不断回溯,
// 程序结束后,path里为空
path.remove(path.size() - 1);
isVisited[i] = false;
}
}
}