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});
}
}