题目:
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]
思路:这个题目时leetcode78题的一个变形,第78题要求给定数组不能存在重复的元素,这个题目可以有重复的元素。同样采用回溯算法,增加一个判断。如果有重复的元素,那么直接跳过。
代码如下:
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> res=new ArrayList<>();
Arrays.sort(nums);//时间复杂度O(Ologn)
backtrack(res,new ArrayList<Integer>(),nums,0);
return res;
}
public void backtrack(List<List<Integer>> res,ArrayList<Integer> list,int[] nums,int start){
res.add(new ArrayList<Integer>(list));//添加空集
for(int i=start;i<nums.length;i++){
if(i>start&&nums[i-1]==nums[i]){
continue;
}else{
list.add(nums[i]);
backtrack(res,list,nums,i+1);
list.remove(list.size()-1); }
}
}
}