全排列(有重复数字)
和无重复数字时候一样,画出解空间树,发现这种在遍历的时候仍然是一样的,只不过列表空间在发现重复的时候需要跳过,怎么发现重复呢,可以进行排序,然后和前一个比就可以。
但是它递归路径中是不用跳过的,所以判断是否跳过时候就需要判断这个是在进行列表的迭代还是递归。一个很巧妙的方法就是看used数组,如果此时前一个值是false,说明已经递归完了,这个是遍历,就可以跳过。如果不是,则不跳过。
class Solution {
List<List<Integer>> res=new ArrayList<List<Integer>>();
public List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length==0){
return res;
}
Arrays.sort(nums);
List<Integer> path=new ArrayList<Integer>();
boolean[] used = new boolean[nums.length];
core(nums,0,path,used);
return res;
}
public void core(int[] nums,int depth,List<Integer> path,boolean[] used){
if(depth==nums.length){//控制深度
res.add(new ArrayList<Integer>(path));
return;
}
for(int i=0;i<nums.length;i++){//控制支数
if (used[i]) {
continue;
}
if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {
continue;
}
path.add(nums[i]);
used[i]=true;
core(nums,depth+1,path,used);
used[i]=false;
path.remove(path.size()-1);
}
}
}