给出一组可能包含重复项的数字,返回该组数字的所有排列。
示例1
输入
复制
[1,1,2]
返回值
复制
[[1,1,2],[1,2,1],[2,1,1]]
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
Arrays.sort(num);
Op op = new Op();
op.num = num;
op.visited = new boolean[num.length];
op.dfs();
return op.res;
}
static class Op{
int[] num;
boolean[] visited;
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
LinkedList<Integer> path = new LinkedList<>();
void dfs() {
if(path.size() ==num.length) {
res.add(new ArrayList<>(path));return;
}
for(int i=0;i<num.length; ++i) {
if(i>0 && num[i]==num[i-1] && (visited[i-1]==false)) {
continue;
}
if(visited[i]) continue;
path.add(num[i]);
visited[i]=true;
dfs();
visited[i]=false;
path.removeLast();
}
}
}
}