【leetcode】全排列

版权声明:转载请注明 https://blog.csdn.net/qq_33591903/article/details/83721483

                                                        全排列

一、要求

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

示例:

输入: [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);
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_33591903/article/details/83721483