此题与全排列1的不同在于 :有重复数字
因此首先需要对数组进行排序 然后对同一树层的数字去重
class Solution {
List<List<Integer>> res=new ArrayList<>();//结果数组
LinkedList<Integer> path=new LinkedList<>(); //路径数组
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums); //对数组进行排序
boolean[] used=new boolean[nums.length]; //记录同一树层某数字是否被使用
dfs(nums,0,used);
return res;
}
public void dfs(int[] nums,int start,boolean[] used){
if(path.size()==nums.length) //若路径数组长度等于目标数组长度
{
res.add(new ArrayList<>(path)); //添加至结果数组中
return;
}
for(int i=0;i<nums.length;i++){ //遍历数组(为树层上的遍历)
//如果前一个数与当前数相同 则直接进行下一次循环
// i>0是为了防止(i-1)索引超出数组范围`
if(i>0&&nums[i]==nums[i-1]&&used[i-1])
{
continue;
}
if(!used[i]){ //这一步即与全排列相同
path.add(nums[i]);
used[i]=true;
dfs(nums,i,used);
used[i]=false;
path.removeLast();
}
}
}
}