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