Permutations,全排列
Posted 32ddd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Permutations,全排列相关的知识,希望对你有一定的参考价值。
问题描述:给定一个数组,数字中数字不重复,求所有全排列。
算法分析:可以用交换递归法,也可以用插入法。
递归法:例如,123,先把1和1交换,然后递归全排列2和3,然后再把1和1换回来。1和2交换,全排列1和3,再把1和2交换回来。1和3交换,全排列2和1,再把1和3交换回来。
1 //递归方法 2 public List<List<Integer>> permute2(int[] num) { 3 List<List<Integer>> result = new ArrayList<>(); 4 permute(num, 0, result); 5 return result; 6 } 7 8 void permute(int[] num, int start, List<List<Integer>> result) { 9 10 if (start == num.length) 11 { 12 ArrayList<Integer> item = convertArrayToList(num); 13 //List<int[]> list = Arrays.asList(num);这个方法适合String,而不适合int,会把int[]当成一个元素加入list 14 result.add(item); 15 } 16 for (int j = start; j < num.length; j++) 17 { 18 //递归方法,首先1和1交换,求除nums[1]外的序列的全排列,然后1和1再交换回来。1和2交换,求除了nums[1]之外的序列的全排列,然后1和2再交换回来。 19 swap(num, start, j); 20 permute(num, start + 1, result); 21 swap(num, start, j); 22 } 23 } 24 25 private ArrayList<Integer> convertArrayToList(int[] num) { 26 ArrayList<Integer> item = new ArrayList<Integer>(); 27 for (int h = 0; h < num.length; h++) { 28 item.add(num[h]); 29 } 30 return item; 31 } 32 33 private void swap(int[] a, int i, int j) { 34 int temp = a[i]; 35 a[i] = a[j]; 36 a[j] = temp; 37 }
插入法:例如123,1开始有1个插入位置得到序列[1],然后2有两个插入位置,得到序列[2,1],[1,2],然后3有三个插入位置,得到[3,2,1],[2,3,1],[2,1,3],[3,1,2],[1,3,2],[1,2,3]
1 public List<List<Integer>> permute(int[] num) { 2 List<List<Integer>> result = new ArrayList<>(); 3 //start from an empty list 4 result.add(new ArrayList<Integer>()); 5 6 for (int i = 0; i < num.length; i++) 7 { 8 List<List<Integer>> current = new ArrayList<>(); 9 10 for (List<Integer> l : result) 11 { 12 //插入size+1个位置 13 for (int j = 0; j < l.size()+1; j++) 14 { 15 l.add(j, num[i]); 16 ArrayList<Integer> temp = new ArrayList<Integer>(l); 17 current.add(temp); 18 l.remove(j); 19 } 20 } 21 22 result = new ArrayList<>(current); 23 } 24 25 return result; 26 }
以上是关于Permutations,全排列的主要内容,如果未能解决你的问题,请参考以下文章
[Leetcode 46]全排列 Permutations 递归
LeetCode 46. 全排列(Permutations)
LeetCode 47. 全排列 II(Permutations II)