全排列

一、要求

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

二、思路

进入初始方法中,第一层循环内,选定【1,2,3】中的第一个数1,加入到list中,形成【1】。

第一层递归,选择2,加入到list中,形成【1,2】。

第二层递归,选择3,加入到list中,形成【1,2,3】。

第三层递归,达到递归终止条件,将list加入到结果集中,形成【【1,2,3】】,并结束第三层递归。

返回到第二层递归中,删除list最后一个元素3,形成【1,2】。

返回到第一层递归中,删除list最后一个元素2,形成【1】。

返回初始方法中,进入到第二个循环中,选定2,形成【2】,依次类推.......


三、代码实现

public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> outer = new ArrayList<List<Integer>>();
List<Integer> list = new ArrayList<>();
recursion(outer, list, nums);
return outer;
}

public void recursion(List<List<Integer>> res, List<Integer> list, int[] nums) {
//递归终止条件,当list长度达到数组长度时,表示找到一个排列,加入到结果队列中,并终止本层递归调用
if (list.size() == nums.length) {
res.add(new ArrayList<>(list));
return;
}
//这部分确实有点抽象,得靠画图理解
for (int i = 0; i < nums.length; i++) {
if (list.contains(nums[i])) {
continue;
}
list.add(nums[i]);
recursion(res, list, nums);
list.remove(list.size() - 1);
}
}