Bird
Raised Fist0
DSA C++programming

Generate All Subsets Powerset in DSA C++

Choose your learning style10 modes available
Mental Model
We find every possible group of items from a list, including empty and full groups.
Analogy: Imagine you have a box of colored beads. You want to see all the ways you can pick some beads or none at all, like making every possible necklace combination.
Set: [1, 2]
Subsets:
[]
[1]
[2]
[1, 2]
Dry Run Walkthrough
Input: list: [1, 2]
Goal: Find all subsets of the list [1, 2], including empty and full subsets.
Step 1: Start with empty subset []
Subsets: [[]]
Why: We begin with no items selected.
Step 2: Add 1 to existing subsets to create new subsets
Subsets: [] and [1]
Why: For each existing subset, add the new element to form new subsets.
Step 3: Add 2 to all existing subsets to create new subsets
Subsets: [], [1], [2], [1, 2]
Why: Repeat the process for the next element to get all combinations.
Result:
Subsets: [] -> [1] -> [2] -> [1, 2]
Annotated Code
DSA C++
#include <iostream>
#include <vector>

using namespace std;

vector<vector<int>> generateSubsets(const vector<int>& nums) {
    vector<vector<int>> subsets = {{}}; // start with empty subset
    for (int num : nums) {
        int n = subsets.size();
        for (int i = 0; i < n; ++i) {
            vector<int> newSubset = subsets[i];
            newSubset.push_back(num); // add current number
            subsets.push_back(newSubset); // add new subset to list
        }
    }
    return subsets;
}

int main() {
    vector<int> input = {1, 2};
    vector<vector<int>> result = generateSubsets(input);
    for (const auto& subset : result) {
        cout << "[";
        for (size_t i = 0; i < subset.size(); ++i) {
            cout << subset[i];
            if (i + 1 < subset.size()) cout << ", ";
        }
        cout << "]\n";
    }
    return 0;
}
vector<vector<int>> subsets = {{}};
Initialize subsets with the empty subset.
for (int num : nums) {
Loop through each number in the input list.
int n = subsets.size();
Store current number of subsets before adding new ones.
for (int i = 0; i < n; ++i) {
Iterate over existing subsets to create new subsets.
vector<int> newSubset = subsets[i];
Copy existing subset to create a new one.
newSubset.push_back(num);
Add current number to the new subset.
subsets.push_back(newSubset);
Add the new subset to the list of all subsets.
OutputSuccess
[] [1] [2] [1, 2]
Complexity Analysis
Time: O(n * 2^n) because for each of the n elements, we double the number of subsets by adding the element to existing subsets.
Space: O(2^n) because the total number of subsets grows exponentially with the number of elements.
vs Alternative: Compared to recursive backtracking, this iterative approach builds subsets step-by-step and is easier to understand but both have similar exponential time and space complexity.
Edge Cases
empty input list
Returns a list with only the empty subset.
DSA C++
vector<vector<int>> subsets = {{}};
single element list
Returns empty subset and subset with that single element.
DSA C++
for (int num : nums) {
When to Use This Pattern
When you need to find all possible combinations or groups from a set, use the powerset pattern because it systematically builds every subset.
Common Mistakes
Mistake: Modifying the subsets list while iterating over it without fixing the iteration boundary.
Fix: Store the current size of subsets before the inner loop and only iterate up to that size.
Summary
Generates all possible subsets of a given list including empty and full subsets.
Use when you need to explore every combination of elements from a set.
The key insight is to build new subsets by adding each element to all existing subsets step-by-step.

Practice

(1/5)
1. What does the "Generate All Subsets (Powerset)" algorithm produce when given a set {1, 2}?
easy
A. Only subsets with two elements: {1, 2}
B. All possible subsets including empty set: {}, {1}, {2}, {1, 2}
C. Only subsets with one element: {1}, {2}
D. Only the empty set: {}

Solution

  1. Step 1: Understand what subsets mean

    Subsets include all combinations of elements, from empty to full set.
  2. Step 2: List all subsets of {1, 2}

    They are {}, {1}, {2}, and {1, 2}.
  3. Final Answer:

    All possible subsets including empty set: {}, {1}, {2}, {1, 2} -> Option B
  4. Quick Check:

    Subsets = all combinations [OK]
Hint: Remember powerset includes empty and full sets [OK]
Common Mistakes:
  • Thinking subsets only have full or single elements
  • Ignoring the empty subset
  • Confusing subsets with permutations
2. Which of the following C++ code snippets correctly initializes an empty vector of vectors to store subsets?
easy
A. std::vector<int> subsets;
B. std::vector subsets = {{}};
C. std::vector subsets;
D. std::vector subsets<int>;

Solution

  1. Step 1: Identify correct vector declaration

    We need a vector of vectors of int to store subsets.
  2. Step 2: Check syntax correctness

    std::vector subsets; uses correct syntax: std::vector subsets; initializes empty vector of vectors.
  3. Final Answer:

    std::vector subsets; -> Option C
  4. Quick Check:

    Correct vector of vectors syntax [OK]
Hint: Use vector for subsets storage [OK]
Common Mistakes:
  • Using vector<int> instead of vector
  • Incorrect template syntax like vector subsets<int>
  • Trying to initialize with empty braces incorrectly
3. What is the output of the following C++ code snippet?
std::vector<int> nums = {1, 2};
std::vector subsets = {{}};
for (int num : nums) {
    int n = subsets.size();
    for (int i = 0; i < n; i++) {
        std::vector<int> newSubset = subsets[i];
        newSubset.push_back(num);
        subsets.push_back(newSubset);
    }
}
for (auto &subset : subsets) {
    for (int x : subset) std::cout << x << " ";
    std::cout << "| ";
}
medium
A. | | 1 | 2 | 1 2 |
B. | | 1 2 | 1 | 2 |
C. | 1 | 2 | 1 2 |
D. | 1 2 | 1 | 2 |

Solution

  1. Step 1: Understand initial subsets and loop

    Initially subsets = {{}}, empty subset only. For each num, we add new subsets by adding num to existing subsets.
  2. Step 2: Trace iterations

    For num=1: subsets become {}, {1}. For num=2: subsets become {}, {1}, {2}, {1, 2}.
  3. Final Answer:

    | | 1 | 2 | 1 2 | -> Option A
  4. Quick Check:

    All subsets printed with spaces and separators [OK]
Hint: Start with empty subset and add elements iteratively [OK]
Common Mistakes:
  • Missing the empty subset in output
  • Printing subsets in wrong order
  • Confusing push_back inside loop
4. Identify the error in this C++ code snippet for generating subsets:
std::vector<int> nums = {1, 2};
std::vector subsets;
for (int num : nums) {
    int n = subsets.size();
    for (int i = 0; i < n; i++) {
        std::vector<int> newSubset = subsets[i];
        newSubset.push_back(num);
        subsets.push_back(newSubset);
    }
}
medium
A. subsets vector is not initialized with empty subset before loop
B. Loop variable i should start from 1, not 0
C. newSubset.push_back(num) should be outside inner loop
D. nums vector should be empty to generate subsets

Solution

  1. Step 1: Check initialization of subsets

    subsets is empty initially, so subsets.size() is 0, inner loop never runs.
  2. Step 2: Identify missing empty subset

    We must start subsets with empty subset {{}} to build new subsets correctly.
  3. Final Answer:

    subsets vector is not initialized with empty subset before loop -> Option A
  4. Quick Check:

    Empty subset needed to start building subsets [OK]
Hint: Always start subsets with empty subset {{}} [OK]
Common Mistakes:
  • Not initializing subsets with empty subset
  • Changing loop start index incorrectly
  • Misplacing push_back calls
5. Given a vector nums = {1, 2, 2}, which code modification ensures the generated subsets contain no duplicate subsets?
hard
A. Generate subsets normally; duplicates are impossible with vector<int>.
B. Use a set to store subsets after generation to remove duplicates.
C. Ignore duplicate elements in nums vector before generating subsets.
D. Sort nums first and skip adding duplicates during subset generation.

Solution

  1. Step 1: Understand duplicates in input

    Input has duplicate 2's, so subsets like {2} can appear multiple times.
  2. Step 2: Use sorting and skip duplicates

    Sorting nums helps detect duplicates; skip adding subsets with same element consecutively to avoid duplicates.
  3. Final Answer:

    Sort nums first and skip adding duplicates during subset generation. -> Option D
  4. Quick Check:

    Sorting + skipping duplicates avoids repeated subsets [OK]
Hint: Sort input and skip duplicates while generating subsets [OK]
Common Mistakes:
  • Assuming duplicates never occur
  • Removing duplicates from input loses valid subsets
  • Using set after generation is less efficient
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard