求数组的全排列

题目: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); } }

  

posted on 2015-07-29 13:26  zxahu  阅读(926)  评论(0编辑  收藏  举报

导航