力扣:全排列java
流程:
设置结果集和当前路径
设置used数组
递归三部曲:
参数和返回值:返回值为空,参数为输入数组
结束条件:当path的长度等于输入数组的长度则path输出到结果集,并返回上一层。
单层递归逻辑:
for循环(i=0;i<nums.length;i++)
循环内,判断nums[i]再之前层是否被使用过,使用过则con
tinue。
path输入当前节点
used[i]设置为true//表示使用了
递归(nums)
回溯:当前节点弹出
used[i]设置为false//回溯后设置为fasle
代码:
class Solution {
List<List<Integer>> result = new ArrayList<>();//结果集
LinkedList<Integer> path = new LinkedList<>();//当前路径
boolean[] used; //使用used数组,判断当前节点是否被使用过
public List<List<Integer>> permute(int[] nums) {//主函数
used = new boolean[nums.length];//对used数组赋值
quanpailie(nums);//递归函数
return result;
}
public void quanpailie(int[] nums){//递归函数
if(path.size() == nums.length){//结束条件,path长度等于nums的长度
result.add(new ArrayList(path));//则将path输入到结果集,并返回上一层
return;
}
for(int i=0;i<nums.length;i++){
if(used[i] == true) continue;//节点被使用过就去取数组的下一位
path.add(nums[i]);//对当前节点输入path
used[i] = true;设置当前节点为true,被使用
quanpailie(nums);//递归下一层
path.removeLast();//回溯弹出当前节点
used[i] = false;//并将当前节点的used修改为false,表示不使用了
}
}
}