- 题目描述:
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [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;}
}