本题采用回溯算法,其实就是一个横向遍历+纵向递归,还需要用一个used数组记录一个数字是否被使用过。
构造res数组记录最终结果 path数组记录过程数组
在递归函数中,首先判断终止条件,当过程数组的大小等于给定数组时,即把过程数组加入到结果数组中,然后返回。
for循环函数用来横向遍历数组,如果当前数字未被使用,则加入过程数组中,并继续递归
如果当前数字已经使用 则继续下一次循环。
在递归后则需要重置used数组,并且由于path数组重复使用 因此在每次递归返回后需要移除数组中最后一个元素
class Solution {
int[] nums;
List<List<Integer>> res=new ArrayList<>();
LinkedList<Integer> path=new LinkedList<>();
public List<List<Integer>> permute(int[] nums) {
this.nums=nums;
boolean[] used=new boolean[nums.length]; //used数组 用来记录数字是否已经被使用
dfs(0,used);
return res;
}
public void dfs(int start,boolean[] used){
if(path.size()==nums.length){
res.add(new ArrayList<>(path));
return;
}
for(int i=0;i<nums.length;i++){ //每次i需要从0开始遍历
if(!used[i]){
path.add(nums[i]);
used[i]=true;
dfs(i+1,used);
used[i]=false;
path.removeLast();
}
}
}
}