描述
给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。
数据范围: 0 < n \le 80<n≤8 ,数组中的值满足 -1 \le val \le 5−1≤val≤5
要求:空间复杂度 O(n!)O(n!),时间复杂度 O(n!)O(n!)
示例1
输入:
[1,1,2]
返回值:
[[1,1,2],[1,2,1],[2,1,1]]
示例2
输入:
[0,1]
返回值:
[[0,1],[1,0]]
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
LinkedList<Integer> numslist=new LinkedList<>();
for(int a:num){
numslist.add(a);
}
//排序--当初始元素有序的时候,遍历的时候可以保证顺序不变;
Collections.sort(numslist);
LinkedList<ArrayList<Integer>>result=new LinkedList<ArrayList<Integer>>();
LinkedList<Integer>cur=new LinkedList<>();
return new ArrayList<ArrayList<Integer>>(getResult(numslist,result,cur));
//递归方法,每次从剩下的元素中挑选一个值;
}
public LinkedList<ArrayList<Integer>>getResult(LinkedList<Integer>nums,LinkedList<ArrayList<Integer>>result,LinkedList<Integer>cur){
//递归边界
if(nums.size()==1){
cur.addLast(nums.getFirst());
result.add(new ArrayList(cur));
return result;
}
//重复过滤器
TreeSet<Integer>temp=new TreeSet<>();
for(int i=0;i<nums.size();i++){
if(!temp.contains(nums.get(i))){
LinkedList<Integer>tempNums=new LinkedList(nums);
temp.add(nums.get(i));
LinkedList<Integer>tempres=new LinkedList<>(cur);
tempres.addLast(nums.get(i));
tempNums.remove(i);
getResult(tempNums,result,tempres);
}
}
return result;
}
}