46.全排列
思路
这道题目将数组中的数字进行全排列,与前面组合不同,前面组合是通过顺序来去除用过的数字(即startIndex,选过之后不会再选第二次,接着选后面的数字),变化的是不同数之间的组合。
但全排列变化的是相同数之间的位置变换,因此每个位置的数(每层递归)都必须重新遍历整个数组,但需排除当前list已经包含的数字,需要使用一个used数组来记录。这样一来就可以理解为在每个位置上暴力选取整个数组的数字(不重复),来完成全排列。
代码
class Solution {
List<List<Integer>> result =new ArrayList<>();
LinkedList<Integer> list=new LinkedList<>();
boolean[] used;
public List<List<Integer>> permute(int[] nums) {
if (nums.length==0) return result;
used=new boolean[nums.length];
backTracking(nums,used);
return result;
}
public void backTracking(int[] nums,boolean[] used){
if (list.size()== nums.length){
result.add(new ArrayList<>(list));
return;
}
for (int i=0;i< nums.length;i++){
if (used[i]) {
continue;
}
used[i]=true;
list.add(nums[i]);
backTracking(nums,used);
used[i]=false;
list.removeLast();
}
}
}