Question
Given a list of numbers that may has duplicate numbers, return all possible subsets.
Example
If S = [1,2,2], a solution is:
[ [2],
[1],
[1,2,2],
[2,2],
[1,2],
[] ]
Challenge
Can you do it in both recursively and iteratively?
Solution
Recursion: 与Subsets 17类似,但是因为有重复元素,为了避免出现重复解,有几点需要注意。
1) 将所有重复元素排在一起,因此首先对输入数组进行排序
2) 避免重复的方法为:重复元素只能取第一个元素,因此在加入元素前要判断该元素值是否和之前元素相等。
Non-Recursion:
代码如下:
Recursion:
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> list = new ArrayList<>();
if(nums == null || nums.length == 0){ return result;}
Arrays.sort(nums);
helper(result, list, nums, 0);
return result;
}
public void helper( List<List<Integer>> result, List<Integer> list, int []nums, int index){
if(!result.contains(list)){result.add(new ArrayList<>(list));}
// result.add(new ArrayList<>(list));
for( int i = index; i < nums.length ; i++){
list.add(nums[i]);
helper(result, list, nums, i+1);
list.remove(list.size() - 1);
}
}
}