描述
给定一个数字列表,返回其所有可能的排列。
你可以假设没有重复数字。
您在真实的面试中是否遇到过这个题?
样例
样例 1:
输入:[1]
输出:
[
[1]
]
样例 2:
输入:[1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
自己写了一套算法,打败了70%,还可以继续优化,比参考答案运行还快!!!
/**
* @param nums: A list of integers.
* @return: A list of permutations.
*/
public static List<List<Integer>> permute(int[] nums) {
// write your code here
List<List<Integer>> lists=new ArrayList<>();
if (nums==null || nums.length==0){
List<Integer> list=new ArrayList<>();
lists.add(list);
return lists;
}
if (nums.length==1){
List<Integer> list=new ArrayList<>();
list.add(nums[0]);
lists.add(list);
return lists;
}
test(nums,lists,0);
return lists;
}
public static void test(int[]nums,List<List<Integer>> list,int index){
List<Integer> list1=new ArrayList<>();
List<Integer> list2=new ArrayList<>();
if ((index+2)==nums.length){
for (int i = 0; i < index; i++) {
list1.add(nums[i]);
list2.add(nums[i]);
}
list1.add(nums[index]);
list1.add(nums[nums.length-1]);
list2.add(nums[nums.length-1]);
list2.add(nums[index]);
list.add(list1);
list.add(list2);
}else {
for (int i=0;i<(nums.length-index);i++){
if (i!=0){
//交换数组位置
int temp=nums[index];
nums[index]=nums[index+i];
nums[index+i]=temp;
int a=index+1;
test(nums,list,a);
//交换到原来得位置
int temp1=nums[index+i];
nums[index+i]=nums[index];
nums[index]=temp1;
}else {
int a=index+1;
test(nums,list,a);
}
}
}
}