标签:
题目: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);
}
}
标签:
原文地址:http://www.cnblogs.com/zxahu/p/4685687.html