Given two sorted arrays arr1 and arr2 of size m and n respectively. We need to find relative complement of two array i.e, arr1 – arr2 which means that we need to find all those elements which are present in arr1 but not in arr2.
Examples:
Input : arr1[] = {3, 6, 10, 12, 15}
arr2[] = {1, 3, 5, 10, 16}
Output : 6 12 15
The elements 6, 12 and 15 are present
in arr[], but not present in arr2[]
Input : arr1[] = {10, 20, 36, 59}
arr2[] = {5, 10, 15, 59}
Output : 20 36
- Take two pointers i and j which traverse through arr1 and arr2 respectively.
- If arr1[i] element is smaller than arr2[j] element print this element and increment i.
- If arr1 element is greater than arr2[j] element then increment j.
- otherwise increment i and j.
Implementation:
C++
// CPP program to find all those // elements of arr1[] that are not// present in arr2[]#include <iostream>using namespace std;void relativeComplement(int arr1[], int arr2[], int n, int m) { int i = 0, j = 0; while (i < n && j < m) { // If current element in arr2[] is // greater, then arr1[i] can't be // present in arr2[j..m-1] if (arr1[i] < arr2[j]) { cout << arr1[i] << " "; i++; // Skipping smaller elements of // arr2[] } else if (arr1[i] > arr2[j]) { j++; // Equal elements found (skipping // in both arrays) } else if (arr1[i] == arr2[j]) { i++; j++; } } // Printing remaining elements of // arr1[] while (i < n) cout << arr1[i] << " "; }// Driver codeint main() { int arr1[] = {3, 6, 10, 12, 15}; int arr2[] = {1, 3, 5, 10, 16}; int n = sizeof(arr1) / sizeof(arr1[0]); int m = sizeof(arr2) / sizeof(arr2[0]); relativeComplement(arr1, arr2, n, m); return 0;} |
Java
// Java program to find all those // elements of arr1[] that are not// present in arr2[]class GFG{ static void relativeComplement(int arr1[], int arr2[], int n, int m) { int i = 0, j = 0; while (i < n && j < m) { // If current element in arr2[] is // greater, then arr1[i] can't be // present in arr2[j..m-1] if (arr1[i] < arr2[j]) { System.out.print(arr1[i] + " "); i++; // Skipping smaller elements of // arr2[] } else if (arr1[i] > arr2[j]) { j++; // Equal elements found (skipping // in both arrays) } else if (arr1[i] == arr2[j]) { i++; j++; } } // Printing remaining elements of // arr1[] while (i < n){ System.out.print(arr1[i] + " "); i++; } } // Driver code public static void main (String[] args) { int arr1[] = {3, 6, 10, 12, 15}; int arr2[] = {1, 3, 5, 10, 16}; int n = arr1.length; int m = arr2.length; relativeComplement(arr1, arr2, n, m); }}// This code is contributed by Anant Agarwal. |
Python3
# Python program to find all those # elements of arr1[] that are not# present in arr2[]def relativeComplement(arr1, arr2, n, m): i = 0 j = 0 while (i < n and j < m): # If current element in arr2[] is # greater, then arr1[i] can't be # present in arr2[j..m-1] if (arr1[i] < arr2[j]): print(arr1[i] , " ", end="") i += 1 # Skipping smaller elements of # arr2[] elif (arr1[i] > arr2[j]): j += 1 # Equal elements found (skipping # in both arrays) elif (arr1[i] == arr2[j]): i += 1 j += 1 # Printing remaining elements of # arr1[] while (i < n): print(arr1[i] , " ", end="") # Driver codearr1= [3, 6, 10, 12, 15]arr2 = [1, 3, 5, 10, 16]n = len(arr1)m = len(arr2)relativeComplement(arr1, arr2, n, m)# This code is contributed# by Anant Agarwal. |
C#
// C# program to find all those // elements of arr1[] that are not// present in arr2[]using System;namespace Complement{ public class GFG { static void relativeComplement(int []arr1, int []arr2, int n, int m) { int i = 0, j = 0; while (i < n && j < m) { // If current element in arr2[] is // greater, then arr1[i] can't be // present in arr2[j..m-1] if (arr1[i] < arr2[j]) { Console.Write(arr1[i] + " "); i++; // Skipping smaller elements of // arr2[] } else if (arr1[i] > arr2[j]) { j++; // Equal elements found (skipping // in both arrays) } else if (arr1[i] == arr2[j]) { i++; j++; } } // Printing remaining elements of // arr1[] while (i < n) Console.Write(arr1[i] + " "); } // Driver code public static void Main() { int []arr1 = {3, 6, 10, 12, 15}; int []arr2 = {1, 3, 5, 10, 16}; int n = arr1.Length; int m = arr2.Length; relativeComplement(arr1,arr2, n, m); } }}// This code is contributed by Sam007 |
PHP
<?php// PHP program to find all those // elements of arr1[] that are not// present in arr2[]function relativeComplement($arr1, $arr2, $n, $m){ $i = 0; $j = 0; while ($i < $n && $j < $m) { // If current element in arr2[] is // greater, then arr1[i] can't be // present in arr2[j..m-1] if ($arr1[$i] < $arr2[$j]) { echo $arr1[$i] , " "; $i++; // Skipping smaller elements of // arr2[] } else if ($arr1[$i] > $arr2[$j]) { $j++; // Equal elements found (skipping // in both arrays) } else if ($arr1[$i] == $arr2[$j]) { $i++; $j++; } } // Printing remaining elements of // arr1[] while ($i < $n) echo $arr1[$i] , " "; }// Driver code{ $arr1 = array(3, 6, 10, 12, 15); $arr2 = array(1, 3, 5, 10, 16); $n = sizeof($arr1) / sizeof($arr1[0]); $m = sizeof($arr2) / sizeof($arr2[0]); relativeComplement($arr1, $arr2, $n, $m); return 0;}// This code is contributed by nitin mittal?> |
Javascript
<script>// JavaScript program to find all those // elements of arr1[] that are not// present in arr2[] function relativeComplement(arr1, arr2, n, m) { let i = 0, j = 0; while (i < n && j < m) { // If current element in arr2[] is // greater, then arr1[i] can't be // present in arr2[j..m-1] if (arr1[i] < arr2[j]) { document.write(arr1[i] + " "); i++; // Skipping smaller elements of // arr2[] } else if (arr1[i] > arr2[j]) { j++; // Equal elements found (skipping // in both arrays) } else if (arr1[i] == arr2[j]) { i++; j++; } } // Printing remaining elements of // arr1[] while (i < n) document.write(arr1[i] + " "); } // Driver Code let arr1 = [3, 6, 10, 12, 15]; let arr2 = [1, 3, 5, 10, 16]; let n = arr1.length; let m = arr2.length; relativeComplement(arr1, arr2, n, m);// This code is contributed by splevel62.</script> |
6 12 15
Time Complexity : O(m + n)
Auxiliary Space: O(1)
Another Approach:
Using an unordered_set we can do the same by following these steps.
- store all the elements of the second array in the set.
- Now traverse the second array and for each element check whether it is present in the set or not
- If the element is not present in the map we add it to our answer array.
Below is the implementation for the same
C++
#include <iostream>#include <unordered_set>#include <vector>using namespace std;void relativeComplement(int arr1[], int arr2[], int n, int m){ // initializing our set unordered_set<int> s; // initialixing our ans vector vector<int> ans; // storing elements of the second array in the set for (int i = 0; i < m; i++) s.insert(arr2[i]); // traversing the second array for (int i = 0; i < n; i++) { // if the element is not found in the set add it to // the ans vector if (s.find(arr1[i]) == s.end()) ans.push_back(arr1[i]); } // printing the answer vector. for (auto x : ans) cout << x << " ";}int main(){ int arr1[] = { 3, 6, 10, 12, 15 }; int arr2[] = { 1, 3, 5, 10, 16 }; int n = sizeof(arr1) / sizeof(arr1[0]); int m = sizeof(arr2) / sizeof(arr2[0]); relativeComplement(arr1, arr2, n, m); return 0;} |
Output:
6 12 15
Time Complexity: O(G) where G is the size of the bigger array.
Auxiliary Space: O(m), we are storing elements of the second array in the set.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Find More here on that Topic: geeksforgeeks.org/find-relative-complement-of-two-sorted-arrays-2/ […]
… [Trackback]
[…] There you will find 77184 additional Info to that Topic: geeksforgeeks.org/find-relative-complement-of-two-sorted-arrays-2/ […]
… [Trackback]
[…] Find More Information here to that Topic: geeksforgeeks.org/find-relative-complement-of-two-sorted-arrays-2/ […]