给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
代码
class Solution {
public static List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
Arrays.sort(nums);
core(nums, new int[nums.length], temp, res);
return res;
}
private static void core(int[] nums, int[] visited, List<Integer> temp, List<List<Integer>> res) {
if (temp.size() == nums.length) {
res.add(new ArrayList<>(temp));
return;
}
for (int i = 0; i < nums.length; i++) {
if (visited[i] == 0) {
//当且仅当重复数字中前面的已经使用过,后面的才可以使用,避免重复
if (i > 0 && nums[i] == nums[i - 1] && visited[i - 1] == 0)
continue;
visited[i] = 1;
temp.add(nums[i]);
core(nums, visited, temp, res);
temp.remove(temp.size() - 1);
visited[i] = 0;
}
}
}
}