给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
package leetCode5_26;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author : caoguotao
* @date 创建时间:2019年5月28日 下午8:59:51
* @version 1.0
* @parameter
* @since
* @return
*/
public class Solution47 {
private boolean[] unUsed;
List<Integer> list = new ArrayList<>();
public static void main(String[] args) {
Solution47 s = new Solution47();
int[] nums = {1,1,-1};
List<List<Integer>> lists = s.permuteUnique(nums);
for (List<Integer> list2 : lists) {
for (Integer integer : list2) {
System.out.print(integer + " ");
}
System.out.println();
}
}
public List<List<Integer>> permuteUnique(int[] nums) {
Set<List<Integer>> sets = new HashSet<List<Integer>>();
unUsed = new boolean[nums.length];
if(nums.length == 0) {
return new ArrayList<List<Integer>>(sets);
}
DFS(nums, sets);
return new ArrayList<List<Integer>>(sets);
}
public void DFS(int[] nums, Set<List<Integer>> sets) {
if(list.size() == nums.length) {
sets.add(new ArrayList<>(list));
return;
}
for(int i = 0; i < nums.length; i++) {
if(!unUsed[i]) {
unUsed[i] = true;
list.add(nums[i]);
DFS(nums, sets);
list.remove(list.size() - 1);
unUsed[i] = false;
}
}
}
}