题目描述:
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
题目难度:中等
分析:
题目和前几题都差不多,直接用Set去重比较简单,递归列出所有的排列。
代码如下:
class Solution { public List<List<Integer>> permuteUnique(int[] nums) { // 结果集,定义成Set可以使去重简单 Set<List<Integer>> res = new HashSet<>(); List<Integer> list = new ArrayList<>(); permute1(nums, list, res, new boolean[nums.length]); return new ArrayList<>(res); } /** * @param nums 数组 * @param nums list 临时结果集 * @param res 结果集 * @param used 记录数组中的元素是否被使用过 */ private void permute1(int[] nums, List<Integer> list, Set<List<Integer>> res, boolean[] used) { // 递归结束的条件 if (list.size() == nums.length) { res.add(new ArrayList<>(list)); } else { for (int i = 0; i < nums.length; i++) { // 如果被使用了,就跳过 if (used[i]) { continue; } int num = nums[i]; list.add(num); // 记录当前元素已被使用 used[i] = true; permute1(nums, list, res, used); used[i] = false; list.remove(list.size() - 1); } } } }
总结:
使用Set去重比较慢,也可以通过给数组排序来达到去重的目的。