题目链接
思路
- 这个和上个题相比,可能产生重复的条件在于。当前元素和相同元素交换产生的排列是重复的
- 所以在swap之前我们要先判断,该位置的元素是否已经和index交换过了。具体的实现是通过一个哈希表来记录出现过的元素
class Solution {
List<List<Integer>> result;
int[] nums;
public List<List<Integer>> permuteUnique(int[] nums) {
result = new ArrayList<>();
this.nums = nums;
helper(0);
return result;
}
private void helper(int index) {
if (index == nums.length)
result.add(Arrays.stream(nums).boxed().collect(Collectors.toList()));
else {
Set<Integer> set = new HashSet<>();
for (int i = index; i < nums.length; i++) {
if (!set.contains(nums[i])) {
set.add(nums[i]);
swap(index, i);
helper(index + 1);
swap(index, i);
}
}
}
}
private void swap(int m, int n) {
int tmp = nums[m];
nums[m] = nums[n];
nums[n] = tmp;
}
}