1. Generate All Combinations + Hash Set Deduplication
Intuition
Recurse on each element with Pick/Don't Pick decisions. When a subset sums to target, sort it and insert into a Hash Set of vectors/strings to filter duplicates. Returns all unique sets.
When to apply: Naive baseline to demonstrate why dedicated branch deduplication is necessary.
Algorithm
- Sort
candidates. - Perform standard Pick/Don't Pick recursion moving
index + 1at each step. - When
target == 0, serialize or sortcurrentand insert intostd::set/HashSet. - Convert set back to 2D list.
#include <iostream>#include <vector>#include <set>#include <algorithm> using namespace std; class Solution { void solve(int index, int target, vector<int>& candidates, vector<int>& current, set<vector<int>>& uniqueCombs) { if (target == 0) { uniqueCombs.insert(current); return; } if (index == candidates.size() || target < 0) return; // Choice 1: Pick current.push_back(candidates[index]); solve(index + 1, target - candidates[index], candidates, current, uniqueCombs); current.pop_back(); // Choice 2: Don't Pick solve(index + 1, target, candidates, current, uniqueCombs); } public: vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { sort(candidates.begin(), candidates.end()); set<vector<int>> uniqueCombs; vector<int> current; solve(0, target, candidates, current, uniqueCombs); return vector<vector<int>>(uniqueCombs.begin(), uniqueCombs.end()); }}; int main() { Solution sol; vector<int> candidates = {10, 1, 2, 7, 6, 1, 5}; auto res = sol.combinationSum2(candidates, 8); for (const auto& c : res) { cout << "[ "; for (int v : c) cout << v << " "; cout << "] "; } cout << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^N * K log K)— Generates all 2N subset combinations, and hashes/sorts each combination of length K. - Space complexity:
O(2^N * K)— Hash Set stores all generated combinations before duplicate elimination.