public class Solution {
boolean[] marked;
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
//存储总的返回结果
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
//存合法全排列
LinkedList<Integer> track = new LinkedList<>();
marked = new boolean[num.length];
//排序
Arrays.sort(num);
backtrack(num, result,track);
return result;
}
public void backtrack(int[] num, ArrayList<ArrayList<Integer>> result, LinkedList<Integer> track){
if(track.size() == num.length){
//一个全排列
result.add(new ArrayList<Integer>(track));
return;
}
for(int i = 0;i< num.length;i++){
if(marked[i] || i >0 && num[i] == num[i-1] &&!marked[i-1]){
// i 访问过了
//或者 回溯后 i本次回溯完变成了fasle 下一次 i+1的时候 如果数相等 那就不需要再遍历了 针对i而言 就是i-1
continue;
}
track.add(num[i]);
//已经访问过了
marked[i] = true;
//寻找下一个 数据
backtrack(num, result, track);
//回溯 最后一个数删除
track.removeLast();
//每一次排列 都需要重置再来
marked[i] = false;
}
}
}