package leecode;
import java.util.*;
/**
 * 47. 全排列 II
 *
 * 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
 *
 * @author Tang
 * @date 2021/12/23
 */
public class PermuteUnique {
    int nums[];
    List<List<Integer>> resultList;
    /**
     * 回溯
     * 循环n次,表示n个位置
     * 对每个位置循环判断每个元素,要么选择要么不选择 (避免一下重复元素)
     *
     * @param nums
     * @return
     */
    public List<List<Integer>> permuteUnique(int[] nums) {
        this.nums = nums;
        resultList = new ArrayList<>();
        track( new ArrayList<>(), new int[nums.length]);
        return resultList;
    }
    /**
     * 对当前n位置,选择一个合适的元素
     *
     */
    private void track(List<Integer> permuteList, int[] hasChoose) {
        if(permuteList.size() == nums.length) {
            ArrayList<Integer> list = new ArrayList<>();
            for (Integer i : permuteList) {
                list.add(i);
            }
            resultList.add(list);
            return;
        }
        //repeat防止同一位置上选择了重复元素
        Set repeat = new HashSet();
        for(int i = 0; i < nums.length; i++) {
            //递归前做出选择
            if(hasChoose[i] == 1 || repeat.contains(nums[i])) {
                continue;
            }
            permuteList.add(nums[i]);
            repeat.add(nums[i]);
            hasChoose[i] = 1;
            //执行递归
            if(permuteList.size() == 4) {
                System.out.println();
            }
            track(permuteList, hasChoose);
            //递归后撤销选择
            permuteList.remove(permuteList.size() - 1);
            hasChoose[i] = 0;
        }
    }
    public static void main(String[] args) {
        new PermuteUnique().permuteUnique(new int[]{3,3,0,3});
    }
}