给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解题思路:跟上一题基本一样,就是在装答案中先装入set去重,再遍历出来放进ans中。
class Solution {
List<List<Integer>> ans=new ArrayList<>();//用来返回大答案
Set<List<Integer>> set=new HashSet<>();//用来去重
int [] path=new int [100];
boolean [] v=new boolean[100];
public void robot(int idx,int [] nums){
if(idx>=nums.length){
//一样的,拼答案
List<Integer> res=new ArrayList<>();
for(int i=0;i<nums.length;i++){
res.add(nums[path[i]]);
}
//去重步骤
set.add(res);
return;
}
for(int i=0;i<nums.length;i++){
if(v[i]==false){
v[i]=true;
path[idx]=i;
robot(idx+1,nums);
v[i]=false;
}
}
}
public List<List<Integer>> permuteUnique(int[] nums) {
robot(0,nums);
//把set的每一个元素取出来放进List<List<Integer>>
for(List<Integer> v:set)
ans.add(v);
return ans;
}
}