Leetcode: Subsets II



Given a collection of integers that might contain duplicates, S, 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 S = [1,2,2], a solution is:
[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]
Iterative Version
Code from http://www.programcreek.com/2013/01/leetcode-subsets-ii-java/
public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
 if (num == null)
  return null;
 Arrays.sort(num);
 ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
 ArrayList<ArrayList<Integer>> prev = new ArrayList<ArrayList<Integer>>();
 for (int i = num.length-1; i >= 0; i--) {
  //get existing sets
  if (i == num.length - 1 || num[i] != num[i + 1] || prev.size() == 0) {
   prev = new ArrayList<ArrayList<Integer>>(result);
  }
  //add current number to each element of the set
  for (ArrayList<Integer> temp : prev) {
   temp.add(0, num[i]);
  }
  //add each single number as a set, only if current element is different with previous
  if (i == num.length - 1 || num[i] != num[i + 1]) {
   ArrayList<Integer> temp = new ArrayList<Integer>();
   temp.add(num[i]);
   prev.add(temp);
  }
  //add all set created in this iteration
  result.addAll(prev);
 }
 //add empty set
 result.add(new ArrayList<Integer>());
 return result;
}
Recursive Version
Code from http://shanjiaxin.blogspot.com/2014/02/subsets-ii-leetcode.html
public static ArrayList<ArrayList<Integer>> subsetsWithDup (int[] num) {
Arrays.sort(num);
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
subsetsWithDupHelper(result, list, num, 0);
return result;
}
private static void subsetsWithDupHelper(ArrayList<ArrayList<Integer>> result, ArrayList<Integer> list, int[] num, int position) {
result.add(new ArrayList<Integer>(list));
for (int i = position; i < num.length; i++) {
if (i != position && num[i] == num[i-1]){
continue;
}
list.add(num[i]);
subsetsWithDupHelper(result, list, num, i+1);
list.remove(list.size() - 1);
}
}


Code from http://jelices.blogspot.com/2014/03/leetcode-subsets-ii.html
public List<List<Integer>> subsetsWithDup(int[] num) {
        Arrays.sort(num);
        List<List<Integer>> solution = new ArrayList<List<Integer>>();
        subsetsWithDup(num, 0, new ArrayList<Integer>(), solution);
        return solution;
    }
    
    public void subsetsWithDup(int[] num, int index, ArrayList<Integer> tempSolution, List<List<Integer>> solution) {
        if(index == num.length)
        {
            solution.add((List<Integer>)tempSolution.clone());
            return;
        }
        
        //Do not add element num[i]
        int value = num[index];
        int i= index;
        while(i<num.length && num[i]==value)
            i++;
        subsetsWithDup(num, i, tempSolution, solution);
            
        //Add element num[i]
        tempSolution.add(num[index]);
        subsetsWithDup(num, index+1, tempSolution, solution);
        tempSolution.remove(tempSolution.size()-1);
    }
Code from http://fisherlei.blogspot.com/2013/01/leetcode-subsets-ii.html
vector<vector<int> > subsetsWithDup(vector<int> &S) {
  vector<vector<int> > result;
  vector<int> output;  
  if(S.size() ==0) return result;
  result.push_back(output);
  sort(S.begin(), S.end());
  generateSub(S, 0, result, output);
}
void generateSub(vector<int> &s, int step, vector<vector<int> > &result, vector<int>& output)
{        
  for(int i = step;i<s.size(); i++ )
  {
output.push_back(s[i]);
result.push_back(output);
if(i< s.size()-1)
 generateSub(s, i+1, result, output);
output.pop_back();
while(i<s.size()-1 && s[i] == s[i+1])
 i++;
  }    
}
Also refer to http://codeganker.blogspot.com/2014/04/subsets-ii-leetcode.html
Read full article from My Own Notes: Leetcode: Subsets II

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts