回溯解法思路:
1.先写一个集合来接收全部的全排列,再写一个集合来接受单个的全排列。在声明一个int【】数组来用于去重用的标记nums数组中什么元素用了的标记。同时排列一下nums数组方便去除重复的全排列。
2.调用回溯函数,终止条件为li2集合的长度等于nums.length,相当于遍历到了结尾,同时要注意相同的数字造成的重复的全排列,所以要去重。在遍历过程中假如Index【i】值为0就表示没有使用该nums【i】的值,使用的nums【i】值的Index【i】值为1。之后进行递归和回溯操作来遍历全部的全排列。
java
class Solution {
//接收全部的全排列
List<List<Integer>> li1=new ArrayList<>();
//接收单个全排列
List<Integer> li2=new ArrayList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
//用于去重用的标记nums数组中什么元素用了的标记
int[] Index=new int[nums.length];
//排列一下nums数组方便去除重复的全排列
Arrays.sort(nums);
//调用回溯函数
huisu(nums,Index);
return li1;
}
//回溯函数
public void huisu(int[] nums,int[] Index){
//终止条件
if(li2.size()==nums.length){
li1.add(new ArrayList<>(li2));
return ;
}
//遍历全部的全排列
for(int i=0;i<nums.length;i++){
//去重相同的数字造成的重复的全排列
if(i>0&&nums[i]==nums[i-1] && Index[i-1]==0){
continue;
}
//假如Index【i】没有用,就进行向下寻找全排列
if(Index[i]==0){
//同时要把Index【i】标记为已使用
Index[i]=1;
//把元素添加到集合li2中
li2.add(nums[i]);
//递归继续寻找
huisu(nums,Index);
//回溯节点,寻找其他节点
Index[i]=0;
li2.removeLast();
}
}
}
}