Check if two arrays are equal or not

Given two given arrays of equal length, the task is to find if given arrays are equal or not. Two arrays are said to be equal if both of them contain same set of elements, arrangements (or permutation) of elements may be different though.

Note : If there are repetitions, then counts of repeated elements must also be same for two array to be equal.

Examples:

Input  : arr1[] = {1, 2, 5, 4, 0};
         arr2[] = {2, 4, 5, 0, 1}; 
Output : Yes

Input  : arr1[] = {1, 2, 5, 4, 0, 2, 1};
         arr2[] = {2, 4, 5, 0, 1, 1, 2}; 
Output : Yes
 
Input : arr1[] = {1, 7, 1};
        arr2[] = {7, 7, 1};
Output : No

A simple solution is to sort both array and then linearly compare elements.

C/C++

// C++ program to find given two array
// are equal or not
#include<bits/stdc++.h>
using namespace std;

// Returns true if arr1[0..n-1] and arr2[0..m-1]
// contain same elements.
bool areEqual(int arr1[], int arr2[], int n, int m)
{
    // If lengths of array are not equal means
    // array are not equal
    if (n != m)
        return false;

    // Sort both arrays
    sort(arr1, arr1+n);
    sort(arr2, arr2+m);

    // Linearly compare elements
    for (int i=0; i<n; i++)
         if (arr1[i] != arr2[i])
            return false;

    // If all elements were same.
    return true;
}

// Driver Code
int main()
{
    int arr1[] = { 3, 5, 2, 5, 2};
    int arr2[] = { 2, 3, 5, 5, 2};
    int n = sizeof(arr1)/sizeof(int);
    int m = sizeof(arr2)/sizeof(int);

    if (areEqual(arr1, arr2, n, m))
        cout << "Yes";
    else
        cout << "No";
    return 0;
}

Java

// Java program to find given two array
// are equal or not
import java.io.*;
import java.util.*;

class GFG 
{
    // Returns true if arr1[0..n-1] and arr2[0..m-1]
    // contain same elements.
    public static boolean areEqual(int arr1[], int arr2[])
    {
        int n = arr1.length;
        int m = arr2.length;
        
        // If lengths of array are not equal means
        // array are not equal
        if (n != m)
            return false;
 
        // Sort both arrays
        Arrays.sort(arr1);
        Arrays.sort(arr2);
 
        // Linearly compare elements
        for (int i=0; i<n; i++)
            if (arr1[i] != arr2[i])
                return false;
 
        // If all elements were same.
        return true;
    }
    
    //Driver code
	public static void main (String[] args) 
	{
        int arr1[] = { 3, 5, 2, 5, 2};
        int arr2[] = { 2, 3, 5, 5, 2};
        
        if (areEqual(arr1, arr2))
            System.out.println("Yes");
        else
            System.out.println("No");

	}
}


Output:

Yes

Time Complexity : O(n log n)
Auxiliary Space : O(1)

 

An Efficient solution of this approach is to use hashing. We store all elements of arr1[] and their counts in a hash table. Then we traverse arr2[] and check if count of every element in arr2[] matches with count in arr1[].

Below is C++ implementation of above idea. We use unordered_map to store counts.

C/C++

// C++ program to find given two array
// are equal or not using hashing technique
#include<bits/stdc++.h>
using namespace std;

// Returns true if arr1[0..n-1] and arr2[0..m-1]
// contain same elements.
bool areEqual(int arr1[], int arr2[], int n, int m)
{
    // If lengths of arrays are not equal
    if (n != m)
        return false;

    // Store arr1[] elements and their counts in
    // hash map
    unordered_map<int, int> mp;
    for (int i=0; i<n; i++)
        mp[arr1[i]]++;

    // Traverse arr2[] elements and check if all
    // elements of arr2[] are present same number
    // of times or not.
    for (int i=0; i<n; i++)
    {
       // If there is an element in arr2[], but
       // not in arr1[]
       if (mp.find(arr2[i]) == mp.end())
          return false;

       // If an element of arr2[] appears more 
       // times than it appears in arr1[]
       if (mp[arr2[i]] == 0)
          return false;

        mp[arr2[i]]--;
    }

    return true;
}

// Driver Code
int main()
{
    int arr1[] = {3, 5, 2, 5, 2};
    int arr2[] = {2, 3, 5, 5, 2};
    int n = sizeof(arr1)/sizeof(int);
    int m = sizeof(arr2)/sizeof(int);

    if (areEqual(arr1, arr2, n, m))
        cout << "Yes";
    else
        cout << "No";
    return 0;
}

Java

// Java program to find given two array
// are equal or not using hashing technique
import java.util.*;
import java.io.*;

class GFG 
{
    // Returns true if arr1[0..n-1] and arr2[0..m-1]
    // contain same elements.
    public static boolean areEqual(int arr1[], int arr2[])
    {
        int n = arr1.length;
        int m = arr2.length;
        
        // If lengths of arrays are not equal
        if (n != m)
            return false;
 
        // Store arr1[] elements and their counts in
        // hash map
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        int count = 0;
        for (int i = 0; i < n; i++)
        {
            if(map.get(arr1[i]) == null)
                map.put(arr1[i], 1);
            else
            {
            	count = map.get(arr1[i]);
            	count ++;
            	map.put(arr1[i], count);
            }   
        }
 
        // Traverse arr2[] elements and check if all
        // elements of arr2[] are present same number
        // of times or not.
        for (int i = 0; i < n; i++)
        {
            // If there is an element in arr2[], but
            // not in arr1[]
            if (!map.containsKey(arr2[i]))
                return false;
 
            // If an element of arr2[] appears more 
            // times than it appears in arr1[]
            if (map.get(arr2[i]) == 0)
                return false;
 
            count = map.get(arr2[i]);
            --count;
            map.put(arr2[i], count);
        }
    
        // again traverse arr2 to ensure that count 
        // for all elelments become zero.
        for(int i = 0; i < n; i++)
        {
            if(map.get(arr2[i]) > 0)
                return false;
        }
        return true;
    }
    
    //Driver code
	public static void main (String[] args) 
	{
        int arr1[] = { 3, 5, 2, 5, 2};
        int arr2[] = { 2, 3, 5, 5, 2};
        
        if (areEqual(arr1, arr2))
            System.out.println("Yes");
        else
            System.out.println("No");

	}
}


Output:

Yes

Time Complexity : O(n)
Auxiliary Space : O(n)

This article is contributed by DANISH_RAZA . If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

GATE CS Corner    Company Wise Coding Practice





Writing code in comment? Please use ide.geeksforgeeks.org, generate link and share the link here.