LCR 083. 全排列
本题使用回溯+标记数组
class Solution {
public List<List<Integer>> permute(int[] nums) {
// 声明两个集合用于收集结果
List<Integer> path=new LinkedList<>();
List<List<Integer>> result=new ArrayList<>();
// 声明标记数组,用于记录使用过的元素
boolean[] used=new boolean[nums.length];
backtracking(nums,used,path,result);
return result;
}
private void backtracking(int[] nums,boolean[] used,List<Integer> path,List<List<Integer>> result){
// 当path集合大小等于原数组大小时,收集结果,结束递归
if(path.size()==nums.length){
result.add(new ArrayList<>(path));
return;
}
for(int i=0;i<nums.length;i++){
// 若该元素已被使用,则跳过
if(used[i]){
continue;
}
// 收集path,在标记数组中标记
path.addLast(nums[i]);
used[i]=true;
backtracking(nums,used,path,result);
// 回溯
used[i]=false;
path.removeLast();
}
}
}