std::vector<std::vector<int> > combinationSum2(std::vector<int> &candidates, int target) { std::sort(candidates.begin(), candidates.end()); std::vector<std::vector<int> > res; std::vector<int> combination; combinationSum2(candidates, target, res, combination, 0); return res; }
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { vector<vector<int>> result; vector<int> combination; sort(candidates.begin(), candidates.end()); combinationSum2(candidates, 0, target, result, combination); return result; }
int main(int argc, char *argv[]) { vector<int> num = {1, 1}; combinationSum2(num, 2); return 0; }
void combinationSum2(std::vector<int> &candidates, int target, std::vector<std::vector<int> > &res, std::vector<int> &combination, int begin) { if (!target) { res.push_back(combination); return; } for (int i = begin; i != candidates.size() && target >= candidates[i]; ++i) if (i == begin || candidates[i] != candidates[i - 1]) { combination.push_back(candidates[i]); combinationSum2(candidates, target - candidates[i], res, combination, i + 1); combination.pop_back(); } }
int main(void) { int x[] = { 10, 1, 2, 7, 6, 1, 5 }; int **res, *col, n, i, j; res = combinationSum2(x, 7, 8, &col, &n); for (i = 0; i < n; i++) { for (j = 0; j < col[i]; j++) printf("%d ", res[i][j]); printf("\n"); } return(0); }
void combinationSum2(vector<int>& candidates, int idx, int target, vector<vector<int>>& result, vector<int>& combination) { if (!target){ result.push_back(combination); return; } for (int i = idx; i < candidates.size() && candidates[i] <= target; i++){ if (i > idx && candidates[i] == candidates[i-1]) continue; // here avoid duplication combination.push_back(candidates[i]); combinationSum2(candidates, i + 1, target - candidates[i], result, combination); combination.pop_back(); } }
int main() { int candidates[] = { 4, 4, 2, 1, 4, 2, 2, 1, 3 }; int target = 6; int returnSize; int *columnSize; int **ans = combinationSum2(candidates, sizeof(candidates) / sizeof(int), target, &columnSize, &returnSize); int i, j; for (i = 0; i < returnSize; ++i) { for (j = 0; j < columnSize[i]; ++j) { printf("%d ", ans[i][j]); } printf("\n"); } system("pause"); return 0; }
int main(int argc, char** argv) { struct timeval tvStart, tvEnd; int retSize, *colSizes; gettimeofday(&tvStart, NULL); combinationSum2(C, sizeof(C) / sizeof(C[0]), T, &colSizes, &retSize); gettimeofday(&tvEnd, NULL); printf("Found %d combinations for target %d\n", retSize, T); int ds = tvEnd.tv_sec - tvStart.tv_sec; int dus = tvEnd.tv_usec - tvStart.tv_usec; if (dus < 0) { ds--; dus += 1000000; } DBG("Time %d.%06d, combinationSum\n", ds, dus); return 0; }
void SubSetTest::testCombination( void ) { int arr[] = {1, 4, 6, 5, 3, 2}; //1 5 2 3 4 6 vector<int> vec; vec.insert(vec.begin(), arr, arr + sizeof(arr) / sizeof(int)); vector<vector<int>> rst = combinationSum2(vec, 5); for (int i = 0; i < rst.size(); ++i) { for (int j = 0; j < rst[i].size(); ++j) { cout<<rst[i][j]<<" "; } cout<<endl; } }
vector<vector<int>> combinationSum3(int k, int n) { vector<int> num; for (int i = 1; i <= 9; ++i) num.push_back(i); return combinationSum2(num, k, n); }