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); } }}