47.全排列
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路:
主要思路和全排列一样,还是回溯
但是多了去重,先排序为了去重,这一项和前一项相同的话并且前一项刚刚
退回来,标志从访问变为未访问
public List<List<Integer>> permuteUnique(int[] nums){
List<List<Integer>> lists=new ArrayList<>();
if(nums==null||nums.length==0)
return lists;
Arrays.sort(nums);
ArrayDeque<Integer> path=new ArrayDeque<>();
int len=nums.length;
boolean used[]=new boolean[len];
dfs(0,lists,path,nums,len,used);
return lists;
}
private void dfs(int level, List<List<Integer>> lists, ArrayDeque<Integer> path, int[] nums, int len, boolean[] used) {
if(level==len){
lists.add(new ArrayList<>(path));
return;
}
for(int i=0;i<len;i++){
if(used[i]) continue;
//去重
if(i>0&&!used[i-1]&&nums[i]==nums[i-1]) continue;
path.addLast(nums[i]);
used[i]=true;
dfs(level+1,lists,path,nums,len,used);
used[i]=false;
path.removeLast();
}
}