题目:
给你一个整数数组 nums
,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
思路:该题与子集那题相比只需多一个去重操作。
第一步:确定参数与返回值。参数为数组nums,起始下标startIndex,无返回值
第二步:确定终止条件。当startIndex>=nums.length时,返回
第三步:确定单层递归逻辑。for循环遍历nums数组,区间为[startIndex,nums.length-1]。如果正在访问的值与前一个值相等,则跳过本轮循环;否则,将值加入path,递归数组剩下的值,回溯
代码:
List<List<Integer>> result=new ArrayList<>();
List<Integer> path=new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
backTracking(nums,0);
return result;
}
public void backTracking(int[] nums,int startIndex){
result.add(new ArrayList(path));
if(startIndex>=nums.length)
return;
for(int i=startIndex;i<nums.length;i++){
//去重
if(i>startIndex&&nums[i]==nums[i-1]){
continue;
}
path.add(nums[i]);
backTracking(nums,i+1);
path.remove(path.size()-1);
}
}