Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
初始化集合或者数组时,指定初始大小可以减少内存的消耗
如果涉及到数据的拆箱和装箱比较消耗时间
class Solution {
List<List<Integer>> res=new ArrayList();
boolean[]isused;
public List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length==0) return res;
isused=new boolean[nums.length];
//对数组进行排序后,可以根据当前数字与前一个数字是否相同来判断是否重复
Arrays.sort(nums);
generatePermuteUnique(nums,0,new ArrayList(nums.length));
return res;
}
//list中保存的是一个有index个元素的排列
//generatePermuteUnique()的作用是向list中添加第index+1个元素
private void generatePermuteUnique(int[]nums,int index,ArrayList<Integer> list){
if(index==nums.length){
res.add(new ArrayList<Integer>(list));
return;
}
for(int i=0;i<nums.length;i++){
//防止重复添加
if(isused[i]||i>0&&nums[i]==nums[i-1]&&!isused[i-1])
continue;
list.add(nums[i]);
isused[i]=true;
generatePermuteUnique(nums,index+1,list);
list.remove(list.size()-1);
isused[i]=false;
}
}
}