- 题目描述:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路:通过分析可知,这道题需要用递归求解,因为递归可以回到上一步的状态,而且,我们需要一个函数来交换数组中的两个数,之后,我们就要思考怎么构造递归函数了,因为需要全排列,所有第一个数下标为0,有n中可能,所有需要和0~n-1的数交换,同样,第二个数需要与1~n-1交换,需要注意的一点是,在递归中需要交换数组中的两个数两次来维护数组递归的正确性
- 代码实现:
class Solution {
List<List<Integer>> result = new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
int len = nums.length;
if(len==0||nums==null) return result;
quan(nums,0,nums.length);
System.out.println("----");
return result;
}
private void quan(int[] nums,int i,int len) {
//当i==len-1是说明已经确定了一个数组,加入结果数组中
if(i==len-1) {
List<Integer> temp = new ArrayList<Integer>();
for(int j=0;j<len;j++) {
temp.add(nums[j]);
}
result.add(temp);
}
//每个数于它后面的数交换,之后查找符合条件的数组,注意交换两遍保证递归正确
for(int v=i;v<len;v++) {
exchange(nums, i, v);
quan(nums,i+1,len);
exchange(nums,i,v);
}
}
public void exchange(int[] nums,int v,int m) {
int temp = nums[v];
nums[v] = nums[m];
nums[m] = temp;
}
}