题目描述
给定一个不含重复数字的数组 nums ,返回其所有可能的全排列。你可以按任意顺序返回答案。
涉及tag
bfs;二叉树;回溯
算法思路
根据题意画出树形图,从根节点开始,随着深度的增加,每一层选择前面没选过的数字参与排列,直到最后的叶子节点上所有数字参与的全排列。
示例代码
class Solution {
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
List<Integer> path = new ArrayList<>();
int len = nums.length;
boolean used[] = new boolean[len];
int depth = 0;
dfs(path, used, depth, nums);
return res;
}
public void dfs(List<Integer> path, boolean used[], int depth, int[] nums) {
//叶子节点
if (depth == nums.length) {
//path的状态变量一直在变化,因为它加进res里的时候并不是加入的一个固定值。默认的path一直指向的同一片内存,所以需要人为给它开辟一个新内存空间
res.add(new ArrayList<>(path));
return;
}
//非叶子节点(一直到第nums.length层为止)
for(int i = 0; i < nums.length; i++) {
//false表示没有加入
if (!used[i]) {
path.add(nums[i]);
used[i] = true;
dfs(path, used, depth + 1, nums);
path.remove(path.size() - 1);
used[i] = false;
}
}
}
}