题目描述:
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] ]
思路1:递归
基本思路和46题一样,不过全排列是按照下标排列的,所以会存在重复的数,所以加上HashSet进行去重即可。
import java.util.ArrayList;
import java.util.HashSet;
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> ret=new ArrayList<>();
if(nums==null||nums.length==0){
return ret;
}
fun(nums,0,ret);
return ret;
}
private void fun(int[] nums, int i, List<List<Integer>> ret) {
if(i==nums.length){
ArrayList<Integer> sub=new ArrayList<>();
for(Integer ele:nums){
sub.add(ele);
}
ret.add(sub);
return;
}
Set<Integer> appeared = new HashSet<>();
for(int j=i;j<nums.length;++j){
if(appeared.add(nums[j])){
swap(nums,i,j);
fun(nums,i+1,ret);
swap(nums,i,j);
}
}
}
private void swap(int[] nums, int i, int j) {
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
思路2:字典序法
本题若采用字典序法,则和46题的解法一模一样,所以说字典序法实现全排列对数组中是否包含重复的数是通用的。
参考https://blog.csdn.net/orangefly0214/article/details/89975999的字典序法实现。