拓展:有重复项字符的所有排列
解法1:Boolean+数组记录

import java.lang.*;
import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
        ArrayList<ArrayList<Integer>> rst = new ArrayList<ArrayList<Integer>>();
        if(num == null || num.length == 0){
            return rst;
        }
        Arrays.sort(num);
        boolean[] visit = new boolean[num.length];
        ArrayList<Integer> list = new ArrayList<>();
        fun(rst,list,visit,num);
        return rst;
    }

    public void fun(ArrayList<ArrayList<Integer>> rst,ArrayList<Integer> list,boolean[] visit,int[] num){
        if(list.size() == num.length){
            rst.add(new ArrayList<Integer>(list));
        }
        for(int i = 0;i<num.length ;i++){
            if(visit[i] == true || (i!=0&&num[i] == num[i-1] )&&visit[i-1] == false){
                continue;
            }
            visit[i] = true;
            list.add(num[i]);
            fun(rst,list,visit,num);
            list.remove(list.size()-1);
            visit[i] = false;
        }
    }
}

解法2:HashSet+交换

import java.util.*;
public class Solution {
    ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
        if (num == null || num.length < 1) 
            return res;
        Arrays.sort(num);
        process2(res,num,0);
        return res;
    }

    public static void process2(ArrayList<ArrayList<Integer>> res,int[] num, int i) {
        if (i == num.length) {
            ArrayList<Integer>list=new ArrayList<Integer>();
            for(int a : num){
                list.add(a);
            }
            res.add(list);
            return;
        }
        HashSet<Integer> set = new HashSet<>();
        for (int j = i; j < num.length; j++) {
            if (!set.contains(num[j])) {
                set.add(num[j]);
                swap(num, i, j);
                process2(res, num, i + 1);
                swap(num, i, j);
            }
        }
    }

    public static void swap(int[] chs, int i, int j) {
        int tmp = chs[i];
        chs[i] = chs[j];
        chs[j] = tmp;
    }
}