描述
给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。
import java.util.ArrayList;
import java.util.Arrays;
public class RepeatPermute {
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
Arrays.sort(num); // 先将数组排序
ArrayList<ArrayList<Integer>> numLists = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
permuteUnique(num,numLists,list);
return numLists;
}
public void permuteUnique(int[] num,ArrayList<ArrayList<Integer>> numLists,ArrayList<Integer> list){
if(num.length == 1){
list.add(num[0]);
numLists.add(new ArrayList<>(list));
list.remove(list.size()-1);
return;
}
int[] newNum = new int[num.length-1];
for (int i = 0; i < num.length; i++) {
boolean isRepeat = false;
for (int j = 0; j < i; j++) {
// 如果当前位置i的值num[i]在之前的位置出现过.此位置就不应该进行递归了
if(num[j] == num[i]){
isRepeat = true;
break;
}
}
if(!isRepeat){
for (int j = 0,k = 0; k < num.length; k++) {
if(k == i){
// 去掉当前位置
continue;
}
// 组成新的数组
newNum[j++] = num[k];
}
list.add(num[i]);
permuteUnique(newNum,numLists,list);
list.remove(list.size()-1);
}
}
}
public static void main(String[] args) {
}
}