Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[1,1,2]
, [1,2,1]
, and [2,1,1]
.
比Permutations那道题就多了一个HashSet判断contains。 下次写注意一下其他写法,比如不用contains试试。
Source
public class Solution {
public List<List<Integer>> permuteUnique(int[] num) {
List<List<Integer>> st = new ArrayList<List<Integer>>();
List<Integer> a = new ArrayList<Integer>();
if(num.length == 0) return st;
Arrays.sort(num);
boolean[] visited = new boolean[num.length];
HashSet<List<Integer>> hs = new HashSet<List<Integer>>();
searchNum(num, st, a, visited, hs);
return st;
}
public void searchNum(int[] num, List<List<Integer>> st, List<Integer> a, boolean[] visited, HashSet<List<Integer>> hs){
if(a.size() == num.length){
if(!hs.contains(a)){
st.add(new ArrayList<Integer>(a)); //注意递归时的st添加要为a新分配空间
hs.add(a);
}
return;
}
for(int i = 0; i < num.length; i++){
if(!visited[i]){
a.add(num[i]);
visited[i] = true;
searchNum(num, st, a, visited, hs);
a.remove(a.size() - 1); //remove***
visited[i] = false;
}
}
}
}
Test
public static void main(String[] args){
int[] num = {-1, -1, -1, 3};
System.out.println(new Solution().permuteUnique(num));
}