描述
给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。
数据范围: 0 < n \le 80<n≤8 ,数组中的值满足 -1 \le val \le 5−1≤val≤5
要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)
输入:[1,1,2]
返回值:[[1,1,2],[1,2,1],[2,1,1]]``
输入:[0,1]
返回值:[[0,1],[1,0]]
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
public class 有重复数字的所有排列 {
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
//存储总的返回结果集
ArrayList<ArrayList<Integer>> output = new ArrayList<>();
//存储一个合法全排列
LinkedList<Integer> track = new LinkedList<>();
boolean[] mark = new boolean[num.length];
//因为存在重复项,为了更好的处理,将数组先排序
Arrays.sort(num);
backTrack(num, output, track, mark);
return output;
}
/**
* 这个方法,用11123套进去演示一遍就知道怎么回事了
*/
private void backTrack(int[] num, ArrayList<ArrayList<Integer>> output, LinkedList<Integer> track, boolean[] mark) {
if(track.size() == num.length){
output.add(new ArrayList<>(track));
return;
}
for (int i = 0; i < num.length; i++) {
if(mark[i] || i > 0 && num[i] == num[i - 1] && !mark[i - 1]){
continue;
}
track.add(num[i]);
mark[i] = true;
backTrack(num, output, track, mark);
track.removeLast();
mark[i] = false;
}
}
}