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], [3,2,1] ]
给定一个数组,求所有的排列组合。
做出这道题很简单,主要是要比较快的速度,第一次做,耗时5ms,比较慢,主要就是用递归,每次向arraylist中放入一个数(不重复),放够数目的数就result.add();
public class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if( nums.length == 0)
return result;
getResult(result,nums,new ArrayList<Integer>(),0);
return result;
}
public static void getResult(List<List<Integer>> result,int[] nums,ArrayList<Integer> ans,int num){
if( num == nums.length){
result.add(new ArrayList<Integer>(ans));
return ;
}
for( int i = 0 ;i <nums.length;i++){
if( !ans.contains(nums[i]) ){
ans.add(nums[i]);
getResult(result,nums,ans,num+1);
ans.remove((Integer)nums[i]);
}
}
}
}
还有一种方法,用迭代,一个数字的时候,就是数字本身,两个数字的时候,就是将第二数字放在第一个数字的左边和右边两种,然后依次类推,在第n个数字的时候,就是在n-1的基础上,每一个空位(每个数字的左边和右边,共n个)放入第n个数字。耗时4ms
public class Solution {
public static List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (nums.length == 0)
return result;
List<Integer> l0 = new ArrayList<Integer>();
l0.add(nums[0]);
result.add(l0);
for( int i = 1;i<nums.length;i++){
List<List<Integer>> l1 = new ArrayList<List<Integer>>();
for( List<Integer> ll : result ){
for(int j =0; j<=i;j++ ){
List<Integer> l2 = new ArrayList<Integer>(ll);
l2.add(j, nums[i]);
l1.add(l2);
}
}
result = l1;
}
return result;
}
}
讲两种方法综合一下,递归+迭代,这样是3ms
public class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> element = new ArrayList<Integer>();
getResult(result, element, nums, 0);
return result;
}
private void getResult(List<List<Integer>> result, List<Integer> element, int[] nums, int n){
if(n==nums.length){
result.add(element);
return;
}
int size = element.size();
for(int i = 0; i <= size; i++){
List<Integer> temp = new ArrayList<Integer>(element);
temp.add(i,nums[n]);
getResult(result, temp, nums, n+1);
}
return;
}
}
然后还有一种方法,有n位数,那么第1位有n种情况,在确定第一位的情况下,第2位就有n-1种情况,以此类推,使用数组就可以使运行时间更快,用时2ms
public class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (nums.length == 0)
return null;
int len = nums.length - 1;
result = getResult(nums, 0, len, result);
return result;
}
public List<List<Integer>> getResult(int[] nums, int k, int len,
List<List<Integer>> result) {
if (k == len) {
List<Integer> subList = new ArrayList<Integer>();
for (int i = 0; i < nums.length; i++) {
subList.add(nums[i]);
}
result.add(subList);
} else {
for (int i = k; i <= len; i++) {
int temp = nums[k];
nums[k] = nums[i];
nums[i] = temp;
getResult(nums, k + 1, len, result);
int temp1 = nums[k];
nums[k] = nums[i];
nums[i] = temp1;
}
}
return result;
}
}
浙公网安备 33010602011771号