Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note:
- Elements in a subset must be in non-descending order.
- The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
This problem is more difficult because we need to handle the duplicate issues.
The solution is to add conditional judgement every time remove an element from the current list.
public class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); List<List<Integer>> ret = new ArrayList<List<Integer>>(); List<Integer> list = new ArrayList<Integer>(); helper(ret, list, nums, 0); return ret; } private void helper(List<List<Integer>> ret, List<Integer> list, int[] nums, int position) { ret.add(new ArrayList<Integer>(list)); for (int i = position; i < nums.length; i++) { list.add(nums[i]); helper(ret,list,nums,i+1); list.remove(list.size() - 1); while(i < nums.length - 1 && nums[i] == nums[i + 1]) i++; } } }