题目
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
解题思路
递归+回溯的标准思想,用一个标记数组开表示哪些元素拿过,用 HashSet
存一下结果就行了。
代码
class Solution {
public int length;
public boolean[] flag;
public List<List<Integer>> permuteUnique(int[] nums) {
length = nums.length;
flag = new boolean[length];
Set<List<Integer>> ans = new HashSet<>();
dfs(ans, nums, new ArrayList<>());
return new ArrayList<>(ans);
}
public void dfs(Set<List<Integer>> ans, int[] nums, List<Integer> now) {
if (now.size() == length) {
ans.add(new ArrayList<>(now));
return;
}
for (int i = 0; i < length; i++) {
if (flag[i]) continue;
flag[i] = true;
now.add(nums[i]);
dfs(ans, nums, now);
now.remove(now.size() - 1);
flag[i] = false;
}
}
}