Subsets
Enumerate all subsets of a unique array — bitmask, recursion, or iterative "double" pattern.
2 min read
subsets backtracking bitmask
Problem#
Given an array of unique integers, return all 2^n subsets in any order.
Examples#
[1,2,3]→[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
Constraints#
1 <= n <= 10.
Approach#
Backtracking — DFS with include/exclude branches.
Iterative doubling — for each element, append it to every existing subset.
Solution#
class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> out = {{}}; for (int x : nums) { int sz = out.size(); for (int i = 0; i < sz; ++i) { out.push_back(out[i]); out.back().push_back(x); } } return out; }};func subsets(nums []int) [][]int { out := [][]int{{}} for _, x := range nums { sz := len(out) for i := 0; i < sz; i++ { cp := make([]int, len(out[i]), len(out[i])+1) copy(cp, out[i]) cp = append(cp, x) out = append(out, cp) } } return out}from typing import List
class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: out: List[List[int]] = [[]] for x in nums: out.extend([sub + [x] for sub in out]) return outfunction subsets(nums) { const out = [[]]; for (const x of nums) { const sz = out.length; for (let i = 0; i < sz; i++) { out.push([...out[i], x]); } } return out;}class Solution { public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> out = new ArrayList<>(); out.add(new ArrayList<>()); for (int x : nums) { int sz = out.size(); for (int i = 0; i < sz; i++) { List<Integer> cp = new ArrayList<>(out.get(i)); cp.add(x); out.add(cp); } } return out; }}function subsets(nums: number[]): number[][] { const out: number[][] = [[]]; for (const x of nums) { const sz = out.length; for (let i = 0; i < sz; i++) { out.push([...out[i], x]); } } return out;}Editorial#
The iterative doubling reflects a clean invariant: after processing the first k elements, out contains all 2^k subsets of them. Adding the next element doubles the list — half retain previous subsets, half append the new element.
Complexity#
- Time: O(n * 2^n).
- Space: O(n * 2^n).
Concept revision#
Related#