Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2] Output: [ [1,1,2], [1,2,1], [2,1,1] ]
解法:
和Permutations解法类似,不过需要加上一个剪枝的过程,即递归的时候,如果发现上一个数被遍历了,而且和当前数一样的时候,需要跳过,避免出现重复情况。https://www.jianshu.com/p/db90675cb82b
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
int len = nums.length;
int[] visit = new int[len];
Arrays.fill(visit,0);
Arrays.sort(nums);
List<Integer> tmp = new ArrayList<>();
findAns(res,tmp,len,nums,visit);
return res;
}
public void findAns(List<List<Integer>>res, List<Integer>tmp,int len,int[] nums,int[] visit){
if(tmp.size() == len){
List<Integer> op = new ArrayList<Integer>(tmp);
res.add(op);
}else{
for(int i=0;i<len;i++){
if(i>0 && visit[i-1] == 1 && nums[i-1]==nums[i]) continue;//关键在于这一句
if(visit[i] == 0){
tmp.add(nums[i]);
visit[i] = 1;
findAns(res,tmp,len,nums,visit);
visit[i] = 0;
tmp.remove(tmp.size()-1);
}
}
}
}
}