和46题一样,区别在于数组中可以有重复的数字,但是结果中要去重.
去重思路:
每次将得到的要存到结果中的list,去和结果中已有的所有list进行一次遍历比对,如果都没有重复,那么就把它加入到结果中.
代码:
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> resList = new ArrayList<>();
List<Integer> list = new ArrayList<>();
__permute(list, nums, 0, resList);
return resList;
}
//固定一个数,递归的排列后面的数
public void __permute(List<Integer> list, int[] nums, int index, List<List<Integer>> resList) {
for (int i = index; i < nums.length; i++) {
//nums[i]交换顺序到第一个位置,index为起始位置
int temp = nums[i];
nums[i] = nums[index];
nums[index] = temp;
list.add(nums[index]);
if (list.size() == nums.length) {
//去重
boolean flag = true;
for (List<Integer> l : resList) {
int p = 0;
Integer[] arr = new Integer[l.size()];
l.toArray(arr);
Integer[] lA = new Integer[list.size()];
list.toArray(lA);
while (p < l.size()) {
if (lA[p] != arr[p]) {
break;
} else p++;
}
if (p == nums.length) {
flag = false;
break;
}
}
if (flag)
resList.add(new ArrayList<>(list));
}
__permute(list, nums, index + 1, resList);
//用完以后先换回来,再去掉
temp = nums[i];
nums[i] = nums[index];
nums[index] = temp;
list.remove(list.size() - 1);
}
}