lintcode-medium-Subsets II
Given a list of numbers that may has duplicate numbers, return all possible subsets
Notice
- Each element in a subset must be in non-descending order.
- The ordering between two subsets is free.
- The solution set must not contain duplicate 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?
class Solution { /** * @param S: A set of numbers. * @return: A list of lists. All valid subsets. */ public ArrayList<ArrayList<Integer>> subsetsWithDup(ArrayList<Integer> S) { // write your code here ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); if(S == null || S.size() == 0){ res.add(new ArrayList<Integer>()); return res; } Collections.sort(S); boolean[] visited = new boolean[S.size()]; ArrayList<Integer> line = new ArrayList<Integer>(); for(int i = 0; i <= S.size(); i++) helper(res, line, i, 0, S, visited); return res; } public void helper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> line, int len, int start, ArrayList<Integer> nums, boolean[] visited){ if(line.size() == len){ res.add(new ArrayList<Integer>(line)); return; } for(int i = start; i < nums.size(); i++){ if(i > 0 && nums.get(i) == nums.get(i - 1) && !visited[i - 1]) continue; line.add(nums.get(i)); visited[i] = true; helper(res, line, len, i + 1, nums, visited); visited[i] = false; line.remove(line.size() - 1); } return; } }