leetcode 48: Subsets II

来源:互联网 发布:html5 css3游戏源码 编辑:程序博客网 时间:2024/04/30 04:55

Jun 25 '12

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],  []]


class Solution {public:    vector<vector<int> > subsets(vector<int> &S) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        vector<vector<int> > rel;        if( S.size() < 1) return rel;        vector<int> temp;        rel.push_back(temp);        sort( S.begin(), S.end() );        subsetsRec( rel, S, temp, 0);                return rel;            }private:    void subsetsRec( vector<vector<int> > & rel, vector<int>& s, vector<int>& temp, int level) {        for( int i=level; i<s.size(); i++) {            temp.push_back( s[i] );            rel.push_back( temp);            subsetsRec( rel, s, temp, i+1);            temp.pop_back();                        while( s[i] == s[i+1] ) i++;    if( i==s.size()-1) return;}}};

 

public class Solution {    public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {        // Start typing your Java solution below        // DO NOT write main() function                //Arrays.sort( num );        ArrayList<ArrayList<Integer>> rel = new ArrayList<ArrayList<Integer>>();        ArrayList<Integer> temp = new ArrayList<Integer>();        rel.add(temp);                Arrays.sort( num );        subsetsRec(rel, temp, num, 0);                 return rel;    }        private void subsetsRec(ArrayList<ArrayList<Integer>> rel, ArrayList<Integer> temp, int[] num, int level){                        for(int i=level; i<num.length; i++) {            temp.add( num[i] );            rel.add( new ArrayList<Integer>(temp)  );                        subsetsRec(rel, temp, num, i+1);                        temp.remove(temp.size() -1);                        while(i<num.length-1 && num[i] == num[i+1] ) i++;                    }                if(level == num.length - 1) return;    }}