Find relative complement of two sorted arrays
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++
#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 (arr1[i] < arr2[j]) {
cout << arr1[i] << " " ;
i++;
} else if (arr1[i] > arr2[j]) {
j++;
} else if (arr1[i] == arr2[j]) {
i++;
j++;
}
}
while (i < n)
cout << arr1[i] << " " ;
}
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;
}
|
Java
class GFG
{
static void relativeComplement( int arr1[], int arr2[],
int n, int m)
{
int i = 0 , j = 0 ;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
System.out.print(arr1[i] + " " );
i++;
} else if (arr1[i] > arr2[j])
{
j++;
}
else if (arr1[i] == arr2[j])
{
i++;
j++;
}
}
while (i < n){
System.out.print(arr1[i] + " " );
i++;
}
}
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);
}
}
|
Python3
def relativeComplement(arr1, arr2, n, m):
i = 0
j = 0
while (i < n and j < m):
if (arr1[i] < arr2[j]):
print (arr1[i] , " " , end = "")
i + = 1
elif (arr1[i] > arr2[j]):
j + = 1
elif (arr1[i] = = arr2[j]):
i + = 1
j + = 1
while (i < n):
print (arr1[i] , " " , end = "")
arr1 = [ 3 , 6 , 10 , 12 , 15 ]
arr2 = [ 1 , 3 , 5 , 10 , 16 ]
n = len (arr1)
m = len (arr2)
relativeComplement(arr1, arr2, n, m)
|
C#
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 (arr1[i] < arr2[j])
{
Console.Write(arr1[i] + " " );
i++;
} else if (arr1[i] > arr2[j])
{
j++;
}
else if (arr1[i] == arr2[j])
{
i++;
j++;
}
}
while (i < n)
Console.Write(arr1[i] + " " );
}
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);
}
}
}
|
Javascript
<script>
function relativeComplement(arr1, arr2,
n, m)
{
let i = 0, j = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
document.write(arr1[i] + " " );
i++;
} else if (arr1[i] > arr2[j])
{
j++;
}
else if (arr1[i] == arr2[j])
{
i++;
j++;
}
}
while (i < n)
document.write(arr1[i] + " " );
}
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);
</script>
|
PHP
<?php
function relativeComplement( $arr1 , $arr2 ,
$n , $m )
{
$i = 0; $j = 0;
while ( $i < $n && $j < $m )
{
if ( $arr1 [ $i ] < $arr2 [ $j ])
{
echo $arr1 [ $i ] , " " ;
$i ++;
}
else if ( $arr1 [ $i ] > $arr2 [ $j ])
{
$j ++;
}
else if ( $arr1 [ $i ] == $arr2 [ $j ])
{
$i ++;
$j ++;
}
}
while ( $i < $n )
echo $arr1 [ $i ] , " " ;
}
{
$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;
}
?>
|
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)
{
unordered_set< int > s;
vector< int > ans;
for ( int i = 0; i < m; i++)
s.insert(arr2[i]);
for ( int i = 0; i < n; i++) {
if (s.find(arr1[i]) == s.end())
ans.push_back(arr1[i]);
}
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;
}
|
Java
import java.io.*;
import java.util.*;
public class GFG {
public static void relativeComplement( int [] arr1, int [] arr2, int n, int m) {
HashSet<Integer> set = new HashSet<>();
ArrayList<Integer> ans = new ArrayList<>();
for ( int i = 0 ; i < m; i++) {
set.add(arr2[i]);
}
for ( int i = 0 ; i < n; i++) {
if (!set.contains(arr1[i])) {
ans.add(arr1[i]);
}
}
for ( int x : ans) {
System.out.print(x + " " );
}
}
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);
}
}
|
Python3
def relative_complement(arr1, arr2):
s = set ()
ans = []
for num in arr2:
s.add(num)
for num in arr1:
if num not in s:
ans.append(num)
for x in ans:
print (x, end = " " )
if __name__ = = "__main__" :
arr1 = [ 3 , 6 , 10 , 12 , 15 ]
arr2 = [ 1 , 3 , 5 , 10 , 16 ]
relative_complement(arr1, arr2)
|
C#
using System;
using System.Collections.Generic;
class Program
{
static void RelativeComplement( int [] arr1, int [] arr2)
{
HashSet< int > set = new HashSet< int >();
List< int > result = new List< int >();
foreach ( int num in arr2)
{
set .Add(num);
}
foreach ( int num in arr1)
{
if (! set .Contains(num))
{
result.Add(num);
}
}
foreach ( int num in result)
{
Console.Write(num + " " );
}
}
static void Main()
{
int [] arr1 = { 3, 6, 10, 12, 15 };
int [] arr2 = { 1, 3, 5, 10, 16 };
RelativeComplement(arr1, arr2);
}
}
|
Javascript
function relativeComplement(arr1, arr2) {
let s = new Set();
let ans = [];
for (let i = 0; i < arr2.length; i++) {
s.add(arr2[i]);
}
for (let i = 0; i < arr1.length; i++) {
if (!s.has(arr1[i])) {
ans.push(arr1[i]);
}
}
console.log(ans.join( ' ' ));
}
let arr1 = [3, 6, 10, 12, 15];
let arr2 = [1, 3, 5, 10, 16];
relativeComplement(arr1, arr2);
|
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.
Last Updated :
02 Dec, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...