当前位置 博文首页 > 阳阳的博客:【leetcode.46】全排列

    阳阳的博客:【leetcode.46】全排列

    作者:[db:作者] 时间:2021-08-14 18:01

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 全排列

    一、要求

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

    示例:

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

    ?

    cs