这道题和Permutations类似,不同的是,现在包含了重复的数字,那么思路相同,还是利用dp,只不过首先进行排序,并且遇到重复的就略过比如1,1,2。那么要做的排序就只有1和2,重复的那个1就被略过。代码如下
public class permuteUnique {
public static List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res =permute(nums);
return res;
}
public static List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res =new ArrayList<>();
if(nums.length==1){
List<Integer> temp = new ArrayList<>();
temp.add(nums[0]);
res.add(temp);
return res;
}
int[] tempNums = new int[nums.length-1];
int pre=0;
for(int i=0;i<nums.length;i++){
if(i>0 && pre==nums[i]){
continue;
}
pre=nums[i];
for(int j=0;j<tempNums.length;j++){
if(j<i){
tempNums[j]=nums[j];
}else if(j>=i){
tempNums[j]=nums[j+1];
}
}
List<List<Integer>> templ = permute(tempNums);
for(int k=0;k<templ.size();k++){
List<Integer> l = templ.get(k);
l.add(nums[i]);
templ.set(k ,l);
}
res.addAll(templ);
}
return res;
}
}
网友评论