求数组的全排列
题目:https://leetcode.com/problems/permutations/
题目要求是求一个数组的全排列,试过很多非递归的方法都不成功,感觉这题有递归会方便很多。
解题思路是这样的,从数组中选出一个数,然后对数组中剩下的数进行全排列;
维持一个result集合,里面存的是已经完成全排列的数字,比如集合是{1,2,3},最开始选出一个数做全排列,那么这个result里有[[1],[2],[3]]
1对应的未排列集合是{2,3},2对应的未排列结合是{1,3}...
构造出一排列集合后,递归的在为排列集合中选出一个数,加入到已排列的集合。
递归退出的条件是未排列的集合为空。
package leet; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; public class Permutations { List<List<Integer>> result = new ArrayList(); public List<List<Integer>> permute(int[] nums) {
//未排列结合为空,则返回序列 if(nums.length == 0){ return result; } List<Integer> list = new LinkedList();
//将要排列的数构造成链表,方便后面使用 List<Integer> num = new LinkedList(); int i; for(i=0;i<nums.length;i++){ num.add(nums[i]); }
//去重 Collections.sort(num); for(i=0;i<num.size()-1;i++){ if(num.get(i) == num.get(i+1)){ num.remove(num.get(i)); } }
//开始构造 permuteNum(num,list); return result; } public void permuteNum(List nums,List list){ int i;
//一次构造结束,将这个顺序加入到result中 if(nums.size() == 0){ result.add(list); return ; } for(i=0;i<nums.size();i++){
//对未排序的集合中的每个数字,构造新的序列,并加入为排列集合中的一个数字 List var = new LinkedList(); var.addAll(list); var.add(nums.get(i)); //构造未排序序列,将刚加入的数字从序列中去掉 List tmp= new LinkedList(); tmp.addAll(nums); tmp.remove(nums.get(i)); //递归排序新的已排序结合和未排序集合 permuteNum(tmp,var); } return; } public static void main(String args[]){ int[] nums = {1,2,3,2,3,1,4}; Permutations p = new Permutations(); p.permute(nums); } }