ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode-047-全排列 II

2021-10-12 08:00:54  阅读:205  来源: 互联网

标签:paths used nums queue MultiTree II add 047 LeetCode


全排列 II

题目描述:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations-ii/
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:穷举法
  • 首先,构造一棵多叉树MultiTree,该多叉树有以下几个属性,used表示当前路径已经走过的数组的位置,paths表示当前路径中的数字。
  • 然后声明一个队列queue,队列的元素就是MultiTree,首先将nums中不同的数字出初始化成路径的第一个数字,然后加入到队列中(需要同时初始化used和paths)。
  • 然后遍历队列queue,按照类似的方式将数组nums中没用到的数字加入到当前路径中(需要判断重复数字)。
  • 直到队列中每一条路径的长度都和nums的长度一样,即已将所有的数字加入到路径中。
  • 最后,返回队列中的所有的路径paths。

说明:其实本来想构造一棵多叉树,所有叶子节点到根节点的路径即为所有的路径排列,后来没用到,所以没有构造树的父子关系 。

import java.util.*;

public class LeetCode_047 {

    /**
     * 构造一棵多叉树
     */
    static class MultiTree {
        // 当前的值
        public Integer val;

        public MultiTree parent;

        // 当前路径已经走过的数组的位置
        public List<Integer> used;

        // 当前路径中的数字
        public List<Integer> paths;

        public MultiTree(Integer val) {
            this.val = val;
            used = new ArrayList<>();
            paths = new ArrayList<>();
        }
    }

    public static List<List<Integer>> permuteUnique(int[] nums) {
        Queue<MultiTree> queue = new LinkedList<>();
        Arrays.sort(nums);
        int curNum = nums[0];
        // 第一条路径
        MultiTree first = new MultiTree(nums[0]);
        first.paths.add(nums[0]);
        first.used.add(0);
        queue.add(first);
        // 其他路径
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] != curNum) {
                MultiTree next = new MultiTree(nums[i]);
                next.paths.add(nums[i]);
                next.used.add(i);
                queue.add(next);
                curNum = nums[i];
            }
        }

        int length = 1;

        while (length < nums.length) {
            int count = queue.size();
            while (count > 0) {
                MultiTree curNode = queue.poll();
                int firstNum = -1, firstNumIndex = -1;
                // 找到第一个已有路径没经过的数
                for (int i = 0; i < nums.length; i++) {
                    if (!curNode.used.contains(i)) {
                        firstNum = nums[i];
                        firstNumIndex = i;
                        MultiTree firstTree = new MultiTree(nums[i]);
                        firstTree.paths.addAll(curNode.paths);
                        firstTree.paths.add(firstNum);
                        firstTree.used.addAll(curNode.used);
                        firstTree.used.add(firstNumIndex);
                        queue.add(firstTree);
                        break;
                    }
                }

                // 将其他不同的数也添加到新的路径
                for (int i = firstNumIndex + 1; i < nums.length; i++) {
                    if (!curNode.used.contains(i) && nums[i] != firstNum) {
                        MultiTree otherTree = new MultiTree(nums[i]);
                        otherTree.paths.addAll(curNode.paths);
                        otherTree.paths.add(nums[i]);
                        otherTree.used.addAll(curNode.used);
                        otherTree.used.add(i);
                        queue.add(otherTree);
                        firstNum = nums[i];
                    }
                }
                count--;
            }
            length++;
        }

        List<List<Integer>> result = new ArrayList<>();
        while (!queue.isEmpty()) {
            result.add(queue.poll().paths);
        }
        return result;
    }

    public static void main(String[] args) {
        int[] nums = new int[]{1, 1, 2};
        for (List<Integer> integers : permuteUnique(nums)) {
            for (Integer integer : integers) {
                System.out.print(integer + " ");
            }
            System.out.println();
        }
    }
}

【每日寄语】 愿太阳的光辉始终洒在你心上。愿所有的不愉快,苦尽甘来。愿每个脆弱的人都能得到善待。愿现实有光,世界有暖。

标签:paths,used,nums,queue,MultiTree,II,add,047,LeetCode
来源: https://www.cnblogs.com/kaesar/p/15396053.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有