题目描述(中等难度)
78题升级版,大家可以先做 78 题。给定一个数组,输出所有它的子数组。区别在于,这道题给定的数组中,出现了重复的数字。
直接根据 78 题的思路去做。
解法一 回溯法
这个比较好改,我们只需要判断当前数字和上一个数字是否相同,相同的话跳过即可。当然,要把数字首先进行排序。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class import_Subsets2_1 {
public static List<List<Integer>> subsetWithDup(int[] nums){
List<List<Integer>>ans=new ArrayList<>();
List<Integer> temp=new ArrayList<>();
Arrays.sort(nums);
getAns(nums,0,temp,ans);
return ans;
}
private static void getAns(int[] nums, int start, List<Integer> temp, List<List<Integer>> ans) {
ans.add(new ArrayList<>(temp));
for(int i=start;i<nums.length;i++) {
if(i>start && nums[i]==nums[i-1]) {
continue;
}
temp.add(nums[i]);
getAns(nums,i+1,temp,ans);
temp.remove(temp.size()-1);
}
}
public static void main(String args[]) {
int[] nums= {1,2,3};
List<List<Integer>> ans=subsetWithDup(nums);
System.out.println(ans);
}
}
时间复杂度:
空间复杂度: