Bird
Raised Fist0
DSA C#programming

Generate All Subsets Powerset in DSA C#

Choose your learning style10 modes available
Mental Model
We want to find every possible group of items you can make from a list, including the empty group and the full list.
Analogy: Imagine you have a box of colored beads. You want to see all the ways you can pick beads from the box, from picking none to picking all of them, and every combination in between.
Input list: [1, 2]
Subsets so far:
[]
[1]
[2]
[1, 2]
Dry Run Walkthrough
Input: list: [1, 2]
Goal: Generate all subsets (powerset) of the list [1, 2]
Step 1: Start with an empty subset
[]
Why: We begin with the empty set as the base subset
Step 2: Add 1 to existing subsets
[]
[1]
Why: Add 1 to each existing subset to create new subsets
Step 3: Add 2 to existing subsets
[]
[1]
[2]
[1, 2]
Why: Add 2 to each existing subset to create all subsets including 2
Result:
[]
[1]
[2]
[1, 2]
Annotated Code
DSA C#
using System;
using System.Collections.Generic;

class PowersetGenerator
{
    public static List<List<int>> GenerateSubsets(List<int> nums)
    {
        List<List<int>> subsets = new List<List<int>>();
        subsets.Add(new List<int>()); // start with empty subset

        foreach (int num in nums)
        {
            int count = subsets.Count; // remember current number of subsets
            for (int i = 0; i < count; i++)
            {
                List<int> newSubset = new List<int>(subsets[i]);
                newSubset.Add(num); // add current number to existing subset
                subsets.Add(newSubset); // add new subset to list
            }
        }

        return subsets;
    }

    static void Main()
    {
        List<int> input = new List<int> { 1, 2 };
        List<List<int>> result = GenerateSubsets(input);

        foreach (var subset in result)
        {
            Console.WriteLine("[" + string.Join(", ", subset) + "]");
        }
    }
}
subsets.Add(new List<int>()); // start with empty subset
Initialize with empty subset as base
int count = subsets.Count; // remember current number of subsets
Fix current subsets count to avoid infinite loop while adding new subsets
List<int> newSubset = new List<int>(subsets[i]);
Copy existing subset to create a new one
newSubset.Add(num); // add current number to existing subset
Add current number to new subset
subsets.Add(newSubset); // add new subset to list
Add 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 all existing subsets
Space: O(2^n) because we store all possible subsets, which is exponential in 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 costs
Edge Cases
empty list
Returns a list with only the empty subset
DSA C#
subsets.Add(new List<int>()); // start with empty subset
list with one element
Returns empty subset and subset with that one element
DSA C#
for (int i = 0; i < count; i++)
When to Use This Pattern
When you need to find all possible combinations or groups from a set, use the powerset generation pattern because it systematically builds every subset.
Common Mistakes
Mistake: Modifying the subsets list while iterating over it without fixing the count causes infinite loops or errors.
Fix: Store the current count of subsets before the loop and only iterate up to that count.
Summary
Generates all possible subsets (powerset) of a given list.
Use when you need every combination of elements from a set.
Start with empty subset and add each element to existing subsets to build new ones.

Practice

(1/5)
1. What does the term powerset mean in the context of subsets?
easy
A. Only the subsets with even number of elements
B. All possible subsets of a given set including empty and full set
C. Subsets that contain only one element
D. Subsets that exclude the empty set

Solution

  1. Step 1: Understand the definition of powerset

    The powerset of a set is the collection of all subsets, including the empty set and the set itself.
  2. Step 2: Compare options with definition

    All possible subsets of a given set including empty and full set correctly describes all subsets including empty and full set. Other options limit subsets incorrectly.
  3. Final Answer:

    All possible subsets of a given set including empty and full set -> Option B
  4. Quick Check:

    powerset = all subsets [OK]
Hint: Powerset means every subset possible, including empty [OK]
Common Mistakes:
  • Thinking powerset excludes empty set
  • Confusing powerset with subsets of fixed size
  • Ignoring the full set as a subset
2. Which of the following C# code snippets correctly initializes an empty list of subsets for generating a powerset?
easy
A. var subsets = new List();
B. var subsets = new List<int>();
C. var subsets = new List();
D. var subsets = new List<int>(); subsets.Add(new List<int>());

Solution

  1. Step 1: Identify the correct data structure for subsets

    Each subset is a list of integers, so the collection of subsets should be a list of lists of integers.
  2. Step 2: Check each option's type

    var subsets = new List(); uses List, which is correct. var subsets = new List<int>(); is List<int> (single list), var subsets = new List(); is List (array instead of list), var subsets = new List<int>(); subsets.Add(new List<int>()); mixes types incorrectly.
  3. Final Answer:

    var subsets = new List(); -> Option A
  4. Quick Check:

    List of list<int> for subsets [OK]
Hint: Use List to hold all subsets [OK]
Common Mistakes:
  • Using List<int> instead of List
  • Confusing arrays with lists
  • Adding elements before initializing list
3. What is the output of the following C# code snippet?
var nums = new int[] {1, 2};
var subsets = new List { new List<int>() };
foreach (var num in nums) {
  int count = subsets.Count;
  for (int i = 0; i < count; i++) {
    var newSubset = new List<int>(subsets[i]) { num };
    subsets.Add(newSubset);
  }
}
foreach (var subset in subsets) {
  Console.Write(string.Join(",", subset) + "|");
}
medium
A. | |1|2|
B. |1|2|1,2|
C. | |1|2|1,2|
D. |1|2|

Solution

  1. Step 1: Trace initial subsets list

    Initially subsets contains one empty list: [[]].
  2. Step 2: Process first number 1

    For num=1, we add subsets: [1] to subsets. Now subsets = [[], [1]].
  3. Step 3: Process second number 2

    For num=2, we add subsets: [2] and [1,2]. Now subsets = [[], [1], [2], [1,2]].
  4. Step 4: Print all subsets

    Empty subset prints as "|", so output is "| |1|2|1,2|".
  5. Final Answer:

    | |1|2|1,2| -> Option C
  6. Quick Check:

    All subsets printed with empty first [OK]
Hint: Empty subset prints as empty string before others [OK]
Common Mistakes:
  • Ignoring empty subset in output
  • Not copying subsets before adding new element
  • Miscounting subsets during iteration
4. Identify the error in the following C# code for generating subsets:
var nums = new int[] {1, 2};
var subsets = new List();
foreach (var num in nums) {
  int count = subsets.Count;
  for (int i = 0; i < count; i++) {
    var newSubset = new List<int>(subsets[i]) { num };
    subsets.Add(newSubset);
  }
}
medium
A. subsets list is not initialized with empty subset
B. Using List<int> instead of List
C. Incorrect loop range in inner for loop
D. Adding elements to subsets inside foreach causes runtime error

Solution

  1. Step 1: Check initialization of subsets

    subsets is empty initially, so count is 0 and inner loop never runs.
  2. Step 2: Understand consequence

    Without starting with empty subset, no new subsets are generated.
  3. Final Answer:

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

    Empty subset needed to start [OK]
Hint: Always start subsets with empty list to generate powerset [OK]
Common Mistakes:
  • Not adding empty subset before loop
  • Assuming subsets auto-initialize
  • Modifying list while iterating without base case
5. Given a list nums = new List<int> {1, 2, 2}, which modification to the standard powerset generation code will correctly generate all unique subsets without duplicates?
hard
A. Use a HashSet to store subsets as strings to avoid duplicates
B. Add all subsets without any check; duplicates will be filtered later
C. Use a Dictionary to map counts and generate subsets
D. Sort nums and skip adding duplicate elements in inner loop

Solution

  1. Step 1: Understand duplicate problem

    Input has duplicates (2 appears twice), so normal powerset code generates duplicate subsets.
  2. Step 2: Identify correct approach

    Sorting nums allows skipping duplicates during subset generation to avoid repeated subsets.
  3. Step 3: Evaluate options

    Sort nums and skip adding duplicate elements in inner loop correctly describes sorting and skipping duplicates. Use a HashSet to store subsets as strings to avoid duplicates is workaround but less efficient. Add all subsets without any check; duplicates will be filtered later allows duplicates. Use a Dictionary to map counts and generate subsets is unrelated.
  4. Final Answer:

    Sort nums and skip adding duplicate elements in inner loop -> Option D
  5. Quick Check:

    Sort and skip duplicates to avoid repeats [OK]
Hint: Sort input and skip duplicates while generating subsets [OK]
Common Mistakes:
  • Not sorting input before generating subsets
  • Trying to remove duplicates after generation
  • Using complex data structures unnecessarily
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