力扣46.全排列
helper函数设计参数说明
- List numList:给定需要排列的所有数字,相当远原题中的nums数组,换成list类型的原因:
①最终要返回的list中,每一个元素都是List类型,最后一步返回时,可直接将numList作为参数传入
②回溯前后需要将数字序列的某两位先交换、再复原,list类型可做参数,直接调用Collections.swap函数 - List<List> ans:一般思路的递归会有返回参数,每次递归返回当前子问题的结果。而这一题①处可直接得到一个分支的完整解,而不是某一分支中递归最底层子问题的解,因此增加该参数,使得在①处直接添加解,而不必将递归子问题的解层层返回到最顶层,再经过合并子解得到一个分支的完整解。
public class Leetcode {
public static List<List<Integer>> permute(int[] nums) {
if(nums.length==0) return new ArrayList<>();
List<List<Integer>> ans = new ArrayList<>();
List<Integer> numList = new ArrayList<>();
for (int i : nums) {
numList.add(i);
}
helper(numList, ans, 0);
return ans;
}
public static void helper(List<Integer> numList, List<List<Integer>> ans, int start){
if(start==numList.size()-1){
ans.add(new ArrayList<>(numList)); //① (注意此处不能直接add(numList),list为引用传参,后续递归时修改numList会导致前面的变动,因此必须新建一个list对象,相当于复制一个副本)
}else{
for(int i=start; i<numList.size(); i++){
Collections.swap(numList, start, i); //②
helper(numList, ans, start+1);
Collections.swap(numList, start, i);
}
}
}
}