给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
先给数组进行排序,递归的退出条件为遍历结束,也就是当前下标已经超过数组限制,把数组中的元素保存到结果中,每个元素都需要存在任何一个位置,不用额外的空间保存结果,直接交换数组元素来达到不同的排列,因为只需要不重复的集合,所以重复的数字也就不需要交换。
public static List<List<Integer>> permute(int[] nums) {
Set<List<Integer>> res = new HashSet<>();
Arrays.sort(nums);
permuteInner(res, nums, 0);
return new ArrayList<>(res);
}
public static void permuteInner(Set<List<Integer>> res, int[] nums, int start) {
if (start >= nums.length) {
List<Integer> list = new ArrayList<>();
for (int i : nums) {
list.add(i);
}
res.add(list);
}
for (int i = start; i < nums.length; ++i) {
if (i != start && nums[i] == nums[start]) {
continue;
}
swap(nums, start, i);
permuteInner(res, nums, start + 1);
swap(nums, start, i);
}
}
public static void swap(int[] nums, int a, int b) {
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}