给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
public class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> st = new ArrayList<List<Integer>>();
List<Integer> a = new ArrayList<Integer>();
if(nums.length == 0) return st;
Arrays.sort(nums);
boolean[] visited = new boolean[nums.length];
HashSet<List<Integer>> hs = new HashSet<List<Integer>>();
searchNum(nums, st, a, visited, hs);
return st;
}
public void searchNum(int[] nums, List<List<Integer>> st, List<Integer> a, boolean[] visited, HashSet<List<Integer>> hs){
if(a.size() == nums.length){
if(!hs.contains(a)){
st.add(new ArrayList<Integer>(a)); //注意递归时的st添加要为a新分配空间
hs.add(a);
}
return;
}
for(int i = 0; i < nums.length; i++){
if(!visited[i]){
a.add(nums[i]);
visited[i] = true;
searchNum(nums, st, a, visited, hs);
a.remove(a.size() - 1); //remove***
visited[i] = false;
}
}
}
}