1.问题描述
给出n个元素的所有可能的排列方式。
如: [1,2,3]的排列有[1,2,3], [1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]
1.1时间复杂度
O(n!)
2.算法思路
我们开始有一个nums数组,其中保存着需要进行排列的数字1,2,3。首先从第一位开始排,第一位可选的值有三种可能即1,2或3,设置一个变量start_index=0,表示我们目前排到了第start-index位,然后分别让nums[start_index]的数字和后面几个的数字交换位置,每交换好一次,就形成了一个新的值,开始往下一位继续递归,递归完毕后需要恢复到原来的位置,再让nums[start_index]和下一位交换位置。
总结来说就是三个步骤:
① 交换元素位置
② 递归
③ 恢复元素位置
全排序.png
3.具体实现
public class Permutation {
public static List permute(int[] nums){
List perms = new ArrayList<>();
permute_recursion(nums,0,perms);
return perms;
}
private static void permute_recursion(int[] nums, int index, List list) {
int len = nums.length;
if(index == len-1){
int [] perm = new int[len];
for(int i=0;i
perm[i] = nums[i];
}
list.add(perm);
}
else{
for(int i = index;i <=len-1;i ++){
swap(nums,index,i);
permute_recursion(nums,index+1,list);
swap(nums,index,i);
}
}
}
private static void swap(int[] nums, int m, int n) {
int temp = nums[m];
nums[m]=nums[n];
nums[n] = temp;
}
}