这一题用到了递归,实际上判断在哪一步递归才是最重要的
这个还是需要继续学习的
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
ArrayList<ArrayList<Integer>> result;
public ArrayList<ArrayList<Integer>> permute(int[] num){
result = new ArrayList<ArrayList<Integer>>();
if(num.length==0) {
return null;
}
Arrays.sort(num);
ArrayList<Integer> list = new ArrayList<Integer>();
childs(list,num);
return result;
}
//查找list的子节点,可能有多种
public void childs(ArrayList<Integer> list,int[] num) {
if(list.size()==num.length) {
//这里一定要new 一个Arra有List,因为result保存的实际上是地址,而list的值最后是一样的而且是最后一步的值(空的),使得最后result的值都是空的,
//所有要new 一个 复制list的值
result.add(new ArrayList<>(list));
return ;
}
//判断num中的数是否有满足list子节点的,子节点的属性包括它自己的值和它的子节点
for(int i=0;i<num.length;i++) {
if(!list.contains(num[i])) {
list.add(num[i]);
//递归的list会有很多个list的增减变化,在满足条件的list状态节点时就添加进结果中,每进入一个childs算法就是一个list路径
childs(list, num);
//下一个可能值
list.remove(list.size()-1);
}
}
}
}