当前位置: 首页 > 后端技术 > Java

LeetCode-047-FullPermutationII

时间:2023-04-02 01:04:34 Java

FullPermutationII题目描述:给定一个可以包含重复数字的序列nums,按任意顺序返回所有不重复的全排列。例子见LeetCode官网。来源:LeetCode链接:https://leetcode-cn.com/probl...版权归LeetCode所有。商业转载请联系官方授权,非商业转载请注明出处。方案一:穷举法首先构造一棵多叉树MultiTree,它有如下属性,used表示当前路径走过的数组的位置,paths表示当前路径中的编号。然后声明一个queue队列,队列的元素是MultiTree,先将nums中不同的数初始化为path的第一个数,然后加入队列(需要同时初始化used和paths)。然后遍历队列,将数组nums中未使用的数字以类似的方式添加到当前路径中(重复数字需要判断)。直到队列中每条路径的长度与nums的长度相同时,所有的数都已经加入到路径中。最后返回队列中的所有路径。说明:其实我想构造一个多叉树。所有叶子节点到根节点的路径就是所有路径的排列。后面没有用到,所以没有构建树的父子关系。importjava.util.*;publicclassLeetCode_047{/***构造一棵多叉树*/staticclassMultiTree{//当前值publicIntegerval;公共多树父级;//当前路径数组publicListused;//当前路径中的数字publicListpaths;publicMultiTree(Integerval){this.val=val;used=newArrayList<>();paths=newArrayList<>();}}publicstaticList>permuteUnique(int[]nums){Queuequeue=newLinkedList<>();Arrays.sort(nums);intcurNum=nums[0];//第一条路径MultiTreefirst=newMultiTree(nums[0]);first.paths.add(nums[0]);first.used.add(0);queue.add(第一);//其他路径for(inti=1;i0){MultiTreecurNode=queue.poll();intfirstNum=-1,firstNumIndex=-1;//找到第一个已经有路径没有经过的数for(inti=0;i>result=newArrayList<>();while(!queue.isEmpty()){result.add(queue.poll().paths);}返回结果;}发布icstaticvoidmain(String[]args){int[]nums=newint[]{1,1,2};for(Listintegers:permuteUnique(nums)){for(Integerinteger:integers){System.out.print(integer+"");}System.out.println();}}}【每日留言】愿阳光的光辉永远照耀你的心田,愿所有的不快都尽头。愿每一个脆弱的人都能被善待。愿现实有光明,人间有温暖。