Given a collection of distinct numbers, return all possible permutations.
For example,
[1,2,3]
have the following permutations:
[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
, and [3,2,1]
.
分析:
采用从nums[0..i-1]递推出nums[0..i]的排列 个数变成了原来的(i+1)倍. 比如,之前nums中的元素是[1,2,3],进行排列的时候我们可以先得到前两个的为[1,2]和[2,1]. 当再加入元素3的时候,针对[1,2]这个排列3有三个空可以插进去变成[3,1,2],[1,3,2]和[1,2,3]. 对[2,1]同理可变成[3,2,1],[2,3,1]和[2,1,3].
/** * 采用从nums[0..i-1]递推出nums[0..i]的排列 个数变成了原来的(i+1)倍. * 比如,之前nums中的元素是[1,2,3],进行排列的时候我们可以先得到前两个的为[1,2]和[2,1]. * 当再加入元素3的时候,针对[1,2]这个排列3有三个空可以插进去变成[3,1,2],[1,3,2]和[1,2,3]. * 对[2,1]同理可变成[3,2,1],[2,3,1]和[2,1,3] */ public List<List<Integer>> permute(int[] nums) { List<List<Integer>> list = new ArrayList(); List<List<Integer>> tempList = new ArrayList();//临时存储的元素 int len = nums.length; if(len<=0){ return list; } /*初始化list中只有一个元素的情况*/ ArrayList<Integer> list1 = new ArrayList<Integer>();//表示外层list的一个元素 list1.add(nums[0]); list.add(list1); /*进入循环从nums[0..i-1]递推出nums[0..i]的排列*/ for(int i=1;i<len;i++){ int size = list.size();//i-1的时候排列的集合个数,相当于nums = [1,2,3],只排列了前两个时得到的[[1,2][2,1]]的长度 for(int j=0;j<size;j++){ list1 = (ArrayList<Integer>) list.get(j);//取出i-1的一个集合,相当于取出[[1,2][2,1]]中的[1,2] int size1 = list1.size(); for(int k=0;k<=size1;k++){//找nums[i]可以插进去的位置 ArrayList<Integer> list2 = new ArrayList<Integer>(); list2.addAll(list1.subList(0, k)); list2.add(nums[i]); list2.addAll(list1.subList(k, size1)); tempList.add(list2); } } /*list首先把之前的元素都清空,然后全部装上最新的元素*/ list.clear(); list.addAll(tempList); tempList.clear(); } return list; }