这道题的最简单的思路就是,我后面的在前面的基础上,从左到右依次换位置插入。
题目:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
我的较笨解决办法:
package test;
import java.util.ArrayList;
import java.util.List;
public class LC46Try1
{
public List<List<Integer>> permute(int[] nums)
{
List<List<Integer>> ret = new ArrayList<List<Integer>>();
int len=nums.length;
if(len==0){
return ret;
}
List<Integer> list=new ArrayList<Integer>();
list.add(nums[0]);
ret.add(list);
for(int i=1;i<len;i++){
int t=nums[i];
List<List<Integer>> temp = new ArrayList<List<Integer>>();
for(int j=0;j<ret.size();j++){
List<Integer> tlist=ret.get(j);
for(int k=0;k<=tlist.size();k++){
List<Integer> lt=new ArrayList<Integer>(tlist);
lt.add(k, t);
temp.add(lt);
}
}
ret=temp;
}
return ret;
}
public static void main(String[] args)
{
LC46Try1 t = new LC46Try1();
int[] nums={1,2,3};
System.out.println(t.permute(nums));
}
}
较好的解决办法:
package test;
import java.util.ArrayList;
import java.util.List;
public class LC46Try2
{
public List<List<Integer>> permute(int[] nums)
{
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> list=new ArrayList<Integer>();
backtracking(result, list, nums, 0);
return result;
}
private void backtracking(List<List<Integer>> result, List<Integer> temp,
int[] nums, int index)
{
if (index==nums.length){
result.add(new ArrayList<Integer>(temp));
return;
}
//就相当于最后一个for循环,时间可能短在 list的复制上
for (int i=0; i<=index; i++){
temp.add (i, nums[index]);
backtracking (result, temp, nums, index+1);
temp.remove (i);
}
}
}
哈哈