题目描述
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:[[1,1,2],[1,2,1],[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
回溯法
模板:
void backtracking(参数){
if(终止条件){
收集结果;
return;
}
for(集合元素){
处理节点;
递归backtracking();
回溯;
}
}
题解
class Solution {
List<List<Integer>> res=new ArrayList<>();
List<Integer> child=new ArrayList<>();
//记录已经存在结果子集(child)中的元素
List<Integer> used=new ArrayList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
backtracking(nums,0);
List<List<Integer>> list=new ArrayList<>();
//去重
Set set = new HashSet();
set.addAll(res);
list.addAll(set);
return list;
}
public void backtracking(int[] nums,int index){
if(child.size()==nums.length){
res.add(new ArrayList<>(child));
return;
}if(child.size()>nums.length){
return;
}
for(int i=0;i<nums.length;i++){
if(used.contains(i)){
continue;
}
child.add(nums[i]);
used.add(i);
backtracking(nums,i+1);
child.remove(child.size()-1);
used.remove(used.size()-1);
}
}
}
PS:Set去重:
//list为待去重的列表,res为去重后的结果
Set set = new HashSet();
set.addAll(list);
res.addAll(set);