# Java

public class Solution {

public List\<List\<Integer>> permuteUnique(int\[] num) {

List\<List\<Integer>> ret= new ArrayList\<List\<Integer>>();

List\<Integer> s=new ArrayList\<Integer>();

if(num==null||num.length==0)

return ret;

Arrays.sort(num);

dfs(ret, s, num, new boolean\[num.length]);

return ret;

}

void dfs(List\<List\<Integer>> ret, List\<Integer> s, int \[] num, boolean \[] used){

if(s.size()==num.length){

ret.add(new ArrayList(s));

return;

}

for(int i=0;i\<num.length;i++){

if(i>0&&!used\[i-1]&\&num\[i-1]==num\[i]) continue;

if(!used\[i]){

used\[i]=true;

s.add(num\[i]);

dfs(ret,s,num,used);

used\[i]=false;

s.remove(s.size()-1);

}

}

}

}
