// Source : https://oj.leetcode.com/problems/subsets-ii/ // Author : Hao Chen // Date : 2014-07-05 /********************************************************************************** * * 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], * [] * ] * * **********************************************************************************/ #include #include #include #include #include #include using namespace std; void getCombination(vector& v, int n, int k, vector& solution, vector< vector >& result ); vector > combine(vector& v, int k); vector > combine1(vector& v, int k); vector > combine2(vector& v, int k); vector > subsets(vector &S) { vector > result; sort(S.begin(), S.end()); for(int i=0; i<=S.size(); i++){ vector > r = combine(S, i); result.insert(result.end(), r.begin(), r.end()); } return result; } vector > combine(vector &v, int k) { vector > result; vector solution; getCombination(v, v.size(), k, solution, result); return result; } void getCombination(vector &v, int n, int k, vector& solution, vector< vector >& result ){ if (k==0){ //sort to meet LeetCode requirement vector v = solution; sort(v.begin(), v.end()); result.push_back(v); return; } for(int i=n; i>0; i--){ solution.push_back(v[i-1]); getCombination(v, i-1, k-1, solution, result); solution.pop_back(); //skip the duplication while (i>1 && v[i-1]==v[i-2]) i--; } } void printResult(vector >& result) { for(int i=0; i& v){ cout << "{"; for(int i=0; i1){ n = atoi(argv[1]); } vector v; for(int i=n; i>0; i--){ v.push_back(random()%n+1); } printArray(v); cout << "--------------------" < > r = subsets(v); printResult(r); cout << "====================" <