void subsetsWithDup(const vector<int>& nums, vector<int> tmp, vector<vector<int>>& ret, int i) {
		if(i == nums.size() && find(ret.begin(), ret.end(), tmp) == -1) {
			ret.push_back(tmp);
			return ;
		}
		subsetsWithDup(nums, tmp, ret, i + 1);
		tmp.push_back(nums[i]);
		subsetsWithDup(nums, tmp, ret, i + 1);
		tmp.pop_back();
	}
    vector<vector<int> > sorted_subsetsWithDup(vector<int> &S) {
        vector<vector<int> > ans;
        if (S.size() == 0) {
            vector<int> temp;
            ans.push_back(temp);
            return ans;
        }

        int back = S.back();
        int dup_len = 0;
        do {
            S.pop_back();
            dup_len++;
        }
        while((S.size() > 0) && (S.back() == back));
        vector<vector<int> > without_back = subsetsWithDup(S);
        ans = without_back;
        for (int l = 0; l < dup_len; ++l) {
            for (int i = 0; i < without_back.size(); ++i) {
                without_back[i].push_back(back);
                ans.push_back(without_back[i]);
            }
        }

        return ans;
    }
Example #3
0
  vector<vector<int> > subsetsWithDup(vector<int> &S, map<vector<int>,int> &nochoice) {
      // Start typing your C/C++ solution below
      // DO NOT write int main() function
      vector<vector<int> > result;
 
      if(S.size() == 0)
      {
          vector<int> empty;
          result.push_back(empty);
          return result;
      }
      else
      {
          int last = S[S.size()-1];
          S.pop_back();
          result = subsetsWithDup(S,nochoice);
          vector<vector<int> > new_result;
          for(int i = 0; i < result.size(); i++)
          {
              vector<int> tmp(result[i].begin(),result[i].end());
              tmp.push_back(last);
              map<vector<int>,int>::iterator it = nochoice.find(tmp);
              if(it == nochoice.end())
              {
                  nochoice.insert(map<vector<int>,int>::value_type(tmp,1));
                  new_result.push_back(tmp);
              }
          }
          for(int i = 0; i < new_result.size(); i++)
              result.push_back(new_result[i]);
          return result;
      }
      
  }
Example #4
0
 vector<vector<int>> subsetsWithDup(vector<int>& nums) 
 {
     vector<int> v = {};
     vector<vector<int>> ret;
     sort(nums.begin(), nums.end());
     subsetsWithDup(nums, v, 0, ret);
     return ret;
 }
Example #5
0
 void subsetsWithDup(vector<int> &nums, vector<int> &v, int beg, vector<vector<int>> &ret)
 {
     ret.push_back(v);
     for(int i = beg; i < nums.size(); ++i)
     {
         if(i == beg || nums[i] != nums[i-1])        //eliminate duplications
         {
             v.push_back(nums[i]);
             subsetsWithDup(nums, v, i + 1, ret);
             v.pop_back();
         }
     }
 }
Example #6
0
int main(void)
{
	int	i, n, **res, *col;
	int	j;
	int	x[] = { 1, 2, 2 };

	res = subsetsWithDup(x, 3, &col, &n);
	for (i = 0; i < n; i++) {
		for (j = 0; j < col[i]; j++)
			printf("%d ", res[i][j]);
		printf("\n");
	}
	return(0);
}
 vector<vector<int>> subsetsWithDup(vector<int>& nums) {
     vector<vector<int>> ret;
     subsetsWithDup(nums, vector<int>(), ret, 0);
     return ret;
 }
Example #8
0
 vector<vector<int> > subsetsWithDup(vector<int> &S)
 {
     map<vector<int>,int> nochoice;
     sort(S.begin(),S.end());
     return subsetsWithDup(S,nochoice);
 }