全排列就是将一串数字排列组合 列出所有的情况,分成有重复的和无重复的,一般来说没有重复数字的比有重复数字的更难的一些,不过大体思路都差不多,都需要用到回溯算法
整体思路: 1.就是把数字一个一个遍历,发现符合条件就加进去,不符合条件的就跳出去,那么这个容器就用ArrayList的形式 那么代码就是:·
public class number{ static ArrayList<String> w = new ArrayList();//符合条件的一组,就往里面装,装的是String类型 static List M = Arrays.asList(1,3,2,5);//待排序的一串数字 /*selected是符合条件就往里面装的暂时容器,choose是含有的排列数字*/ public static void run(List <Integer> selected,List <Integer> choose) { } }2.准备好装东西的容器之后,就是要考虑函数的退出条件,也就是当selected里面的元素多到和待排序的数字一样长的时候,就退出函数 代码这样:
public class number{ static ArrayList<String> w = new ArrayList(); static List M = Arrays.asList(1,3,2,5); public static void run(List <Integer> selected,List <Integer> choose) { if(selected.size()==M.size()) {//判断selected里面的元素是否和M一样,一样的话,咱们就退出 w.add(Arrays.toString(selected.toArray()));//因为w是加String类型的,总体要比二维的ArrayList更好存储 return; } } }3.接下来就是回溯的关键步骤,就是想办法让待排序的数字一个一个遍历,符合条件就加入selected,不符合就跳过,先一个for循环找到choose里面的所有元素,然后判断一下这个元素selected里面有,如果有,我们就跳过,没有我们就加进去,然后递归,直到selected满足待排列数字的长度为止,满足这个长度,我们立刻就将最后加进去的元素移除,继续进行循环,说起来不太明白,参考代码+图解就比较好理解 先看代码:
public class number{ static ArrayList<String> w = new ArrayList(); static List M = Arrays.asList(1,3,2,5); public static void run(List <Integer> selected,List <Integer> choose) { if(selected.size()==M.size()) { w.add(Arrays.toString(selected.toArray())); return; } /*遍历所有元素*/ for(int i=0;i<choose.size();i++) { Integer num = choose.get(i);//选择一个元素,然后判断之前有没有选择这个数字,一定要用Integer类型,,不要用int类型,不然会出问题 if(selected.contains(num)) {//如果选过了的话,就直接跳过 continue; } //没选过我们把num加入到selected当中 selected.add(num); //进入递归,又判断下一把的selected有没有num,再考虑是否加元素,直到selected长度等于待排序的数字总长度 run(selected,choose); //满足之后,我们就移除num,再次进入循环即可 selected.remove(num); } } }通过代码j+图解,看起来还算是比较容易理解,就是不停地套娃,如果满足就回溯,又接着套娃直到第一层的for循环彻底结束 代码成品:
public class number{ static ArrayList<String> w = new ArrayList(); static List M = Arrays.asList(1,3,2,5); public static void run(List <Integer> selected,List <Integer> choose) { if(selected.size()==M.size()) { w.add(Arrays.toString(selected.toArray())); return; } for(int i=0;i<choose.size();i++) { Integer num = choose.get(i); if(selected.contains(num)) { continue; } selected.add(num); run(selected,choose); selected.remove(num); } } public static void main(String[] args) { ArrayList <Integer> selected = new ArrayList(); run(selected,M); System.out.println(w); } }