与不含重复数字的全排列相比,在于:
排序;
添加对上一数字的判断
class Solution {
LinkedList<List<Integer>> ans=new LinkedList<>();
LinkedList<Integer> path=new LinkedList<>();
boolean[] used;
public List<List<Integer>> permuteUnique(int[] nums) {
used=new boolean[nums.length];
Arrays.sort(nums);//全排列去重,这是关键
dfs(nums,0);
return ans;
}
void dfs(int[] nums,int cnt){
if(cnt==nums.length){
ans.add(new LinkedList(path));
return;
}
for(int i=0;i<nums.length;i++){
if(i>0&&nums[i]==nums[i-1]&&!used[i-1])//上一个数字和本数字相同,且上一个数字没有被访问。
//那么本次的搜索一定是是重复的
continue;
if(!used[i]){
used[i]=true;
path.add(nums[i]);
dfs(nums,cnt+1);
used[i]=false;
path.removeLast();
}
}
}
}