Subsets Of a Given Array, a Google Interview Question
In this coding problem, we need to find the power-set of given input without duplicates.
Overview
In this article, we discuss the subsets of a given input. This is one of the most popular questions asked in coding interviews.
Companies that have asked this in their coding interview are Apple, Microsoft, Amazon, Facebook, and many more.
Problem Statement
We need to write a program that finds all possible subsets (the power set) of a given input. The solution set must not contain duplicate subsets.
Example 1:
Input: [1, 2, 3]
Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
Example 2:
Input: [100]
Output: [[], [100]]
Explanation:
- The subsets of any given input are equal to its power set.
- If input
n=3
, the powerset will be2n
, which is23 = 8
. - Assume input has a length greater than or equal to
1
.
In this program, we find the power set of a given input using bitwise operations. In general, if we have n
elements then the subsets are 2n
subsets. So for every possible case of having at least two elements, we can see that an element is present and not present in the subsets. Think of a solution that is iterative, uses bitwise operators, and generates the powerset.
Here is how we generate each subset using the outer-loop variable counter
. Here is a table indicating how the value gets generated based on the counter
input.
Counter(in decimal) | 0 |
Counter(in binary) | 000 |
Subset | [] |
Counter(in decimal) | 1 |
Counter(in binary) | 001 |
Subset | [1] |
Counter(in decimal) | 2 |
Counter(in binary) | 010 |
Subset | [2] |
Counter(in decimal) | 3 |
Counter(in binary) | 011 |
Subset | [1,2] |
Counter(in decimal) | 4 |
Counter(in binary) | 100 |
Subset | [3] |
Counter(in decimal) | 5 |
Counter(in binary) | 101 |
Subset | [1,3] |
Counter(in decimal) | 6 |
Counter(in binary) | 110 |
Subset | [2,3] |
Counter(in decimal) | 7 |
Counter(in binary) | 111 |
Subset | [1,2,3] |
Algorithm
We need to consider a counter
variable that starts from 0
to 2n - 1
.
For every value, we are considering the binary representation and here we use the set bits in the binary representation to generate corresponding subsets.
- If all set bits are
0
, then the corresponding subset is empty[]
. - If the last bit is
1
, then we put1
in the subset as[1]
.
Steps:
We use two loops here, the outer loop starts from 0
to 2n - 1
, and the inner loop continues to input array length n
.
In the inner loop, we conditionally check (counter & (1 << j )) != 0)
, if yes, then we print the corresponding element from an array.
Solution
Complexity analysis
Time Complexity: O(n*2n)
the time complexity isn
times the power set.
Space Complexity: O(2n)
we are storing 2n
subset elements in an array. So the extra space is directly proportional to O(2n)
.
📚 Top Recommended Books
- JavaScript: The Definitive Guide: Master the World's Most-Used Programming Language, 7th Edition (Greyscale Indian Edition).
- Eloquent JavaScript: A Modern Introduction to Programming.
- You Don`t Know JS: 6 Volume Set (Greyscale Indian Edition).
- Learning JavaScript Design Patterns: A JavaScript and React Developer's Guide, Second Edition (Grayscale Indian Edition).