When working with arrays, one common problem in Data Structures and Algorithms (DSA) is to find the intersection ā i.e., elements that appear in both arrays.
For example, if you have two lists of numbers, you might want to find out which numbers are common to both. This is a common question in coding interviews, and it helps you strengthen your logic-building skills.
š” What Is the Intersection of Two Arrays?
The intersection of two arrays means the set of elements that appear in both arrays.
Example
Array A = [1, 2, 3, 4, 5]
Array B = [3, 4, 5, 6, 7]
ā
Intersection = [3, 4, 5]
These numbers are present in both arrays A and B.
āļø Approach 1. Brute Force (Simple but Less Efficient)
š§ Logic
For each element in array A, check whether it exists in array B.
If yes, add it to the intersection list.
ā±ļø Time Complexity: O(n²)
š¾ Space Complexity: O(1)
š» C++ Code Example
#include <iostream>using namespace std;
int main() {
int A[] = {1, 2, 3, 4, 5};
int B[] = {3, 4, 5, 6, 7};
int n = 5, m = 5;
cout << "Intersection: ";
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(A[i] == B[j]) {
cout << A[i] << " ";
break;
}
}
}
return 0;
}
ā
Output
Intersection: 3 4 5
ā” Approach 2. Using Hashing (Efficient and Common)
š§ Logic
Store all elements of the first array in a hash set.
Traverse the second array, and check if an element exists in the set.
If yes, add it to the intersection.
ā±ļø Time Complexity: O(n + m)
š¾ Space Complexity: O(n)
š» C++ Code Example
#include <iostream>#include <unordered_set>using namespace std;
int main() {
int A[] = {1, 2, 3, 4, 5};
int B[] = {3, 4, 5, 6, 7};
int n = 5, m = 5;
unordered_set<int> s(A, A + n);
cout << "Intersection: ";
for (int i = 0; i < m; i++) {
if (s.find(B[i]) != s.end()) {
cout << B[i] << " ";
s.erase(B[i]); // to avoid duplicates
}
}
return 0;
}
ā
Output
Intersection: 3 4 5
š Why Use Hashing?
Hashing provides O(1) average lookup time, making it much faster than the brute-force method, especially for large datasets.
š Approach 3. Two-Pointer Technique (When Arrays Are Sorted)
š§ Logic
Sort both arrays if not sorted.
Use two pointers ā one for each array.
Compare elements:
If A[i] == B[j], add to intersection and move both pointers.
If A[i] < B[j], move i forward.
Else, move j forward.
ā±ļø Time Complexity: O(n + m)
š¾ Space Complexity: O(1)
š» C++ Code Example
#include <iostream>#include <algorithm>using namespace std;
int main() {
int A[] = {1, 2, 3, 4, 5};
int B[] = {3, 4, 5, 6, 7};
int n = 5, m = 5;
int i = 0, j = 0;
cout << "Intersection: ";
while (i < n && j < m) {
if (A[i] == B[j]) {
cout << A[i] << " ";
i++;
j++;
}
else if (A[i] < B[j])
i++;
else
j++;
}
return 0;
}
ā
Output
Intersection: 3 4 5
š Comparison Table
Approach | Time Complexity | Space Complexity | Suitable For |
---|
Brute Force | O(n²) | O(1) | Small arrays |
Hashing | O(n + m) | O(n) | Unsorted arrays |
Two Pointer | O(n + m) | O(1) | Sorted arrays |
š§ Real-Life Use Case
Finding common friends between two users on social media.
Identifying common customers between two databases.
Comparing tags or keywords shared between two documents.
š Conclusion
Finding the intersection of two arrays is a fundamental DSA problem that strengthens your understanding of searching, hashing, and sorting.
Mastering these methods will help you in technical interviews, especially for roles involving data structures and algorithms.