全排列 II
题目形容:给定一个可蕴含反复数字的序列 nums,按任意程序 返回所有不反复的全排列。
示例阐明请见 LeetCode 官网。
起源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl…
著作权归领扣网络所有。商业转载请分割官网受权,非商业转载请注明出处。
解法一:穷举法
- 首先,结构一棵多叉树 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();}
}
}
【每日寄语】 愿太阳的光芒始终洒在你心上。愿所有的不欢快,苦尽甘来。愿每个软弱的人都能失去善待。愿事实有光,世界有暖。