Skip to content
Related Articles

Related Articles

Improve Article

Minimum swaps of same indexed elements required to obtain a Majority Element in one of the arrays

  • Last Updated : 19 May, 2021

Given two arrays arr[] and brr[] of length N, the task is to find the minimum number of swaps of the same indexed elements required such an element occurs at least half of the indices in the array arr[], i.e. Majority element. If it is not possible to obtain such an arrangement, then print “-1”.

Examples:

Input: arr[] = {3, 2, 1, 4, 9}, brr[] = {5, 5, 3, 5, 3}
Output: 2
Explanation:
Following are the swaps required:
Swap 1: Swapping arr[1] and brr[1] modifies arr[] to {3, 2, 3, 4, 9} and brr[] to {5, 5, 1, 5, 3}.
Swap 2: Swapping arr[5] and brr[5] modifies arr[] to {3, 2, 3, 4, 3} and brr[] to {5, 5, 1, 5, 9}.
Therefore, the total number of swaps required is 2.

Input: arr[] = {2, 4, 2}, brr[] = {1, 2, 9}
Output: 0

Approach: Follow the steps below to solve the above problem:



  • Initialize a variable res as INT_MAX that stores the minimum swap required.
  • Find the frequency count of arrays a[] and b[] elements using hashing and store it in the map A and B respectively.
  • Create an array, crr[] of size 2*N to store all elements from the array arr[] and brr[].
  • Traverse the array crr[] using the variable i and do the following:
    • If the frequency of crr[i] in map A is at least N/2 then the minimum swap required is 0 and break out of the loop and print 0.
    • If the sum of the frequency of crr[i] in maps A and B is at least N/2 then update res to the minimum of res and (N/2 – A[crr[i]]).
  • After the above steps, if the value of res is still INT_MAX, then print “-1”.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function that counts the minimum
// number of swaps required to make
// half of the element same in a[]
int minMoves(int a[], int b[], int n)
{
 
    // Stores frequency of elements in a[]
    // Stores frequency of elements in b[]
    unordered_map<int, int> A, B;
 
    // Stores all elements from both arrays
    vector<int> c;
 
    // Find the maximum occurrence
    // required
    int maxOccur = ceil(floor(n)
                        / (2 * 1.0));
 
    for (int i = 0; i < n; ++i) {
 
        c.push_back(a[i]);
        c.push_back(b[i]);
 
        A[a[i]]++;
 
        // If a[i] == b[i], then no need
        // of incrementing in map B
        if (b[i] != a[i]) {
            B[b[i]]++;
        }
    }
 
    // Store the minimum number of swaps
    int res = INT_MAX;
 
    for (int i = 0; i < c.size(); ++i) {
        // Frequency of c[i] in array a
        int x = A];
 
        // Frequency of c[i] in array b
        int y = B];
 
        // Check the frequency condition
        if ((x + y) >= maxOccur) {
 
            // if c[i] is present at
            // least half times in array
            // a[], then 0 swaps required
            if (x >= maxOccur) {
                return 0;
            }
 
            // maxOccur - x is the count
            // of swaps needed to make
            // c[i] the majority element
            else {
                res = min(res, maxOccur - x);
            }
        }
    }
 
    // If not possible
    if (res == INT_MAX) {
        return -1;
    }
 
    // Otherwise
    else
        return res;
}
 
// Driver Code
int main()
{
 
    // Given arrays a[] and b[]
    int arr[] = { 3, 2, 1, 4, 9 };
    int brr[] = { 5, 5, 3, 5, 3 };
 
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    cout << minMoves(arr, brr, N);
 
    return 0;
}

Java




// Java program for the
// above approach
import java.util.*;
class Main{
     
// Function that counts the minimum
// number of swaps required to make
// half of the element same in a[]
public static int minMoves(int a[],
                           int b[],
                           int n)
{
  // Stores frequency of elements
  // in a[]
  // Stores frequency of elements
  // in b[]
  HashMap<Integer,
          Integer> A =
          new HashMap<>();
  HashMap<Integer,
          Integer> B =
          new HashMap<>();
 
  // Stores all elements from
  // both arrays
  Vector<Integer> c =
         new Vector<Integer>();
 
  // Find the maximum occurrence
  // required
  int maxOccur = (int)Math.ceil(
                 (int)Math.floor(n) /
                 (2 * 1.0));
 
  for (int i = 0; i < n; ++i)
  {
    c.add(a[i]);
    c.add(b[i]);
 
    if(A.containsKey(a[i]))
    {
      A.replace(a[i],
      A.get(a[i]) + 1);
    }
    else
    {
      A.put(a[i], 1);
    }
 
    // If a[i] == b[i], then no need
    // of incrementing in map B
    if (b[i] != a[i])
    {
      if(B.containsKey(b[i]))
      {
        B.replace(b[i],
        B.get(b[i]) + 1);
      }
      else
      {
        B.put(b[i], 1);
      }
    }
  }
 
  // Store the minimum number
  // of swaps
  int res = Integer.MAX_VALUE;
 
  for (int i = 0; i < c.size(); ++i)
  {
    // Frequency of c[i] in array a
    int x = 0;
    if(A.containsKey(c.get(i)))
    {
      x = A.get(c.get(i));  
    }
 
    // Frequency of c[i] in array b
    int y = 0;
    if(B.containsKey(c.get(i)))
    {
      y = B.get(c.get(i));  
    }
 
    // Check the frequency
    // condition
    if ((x + y) >= maxOccur)
    {
      // if c[i] is present at
      // least half times in array
      // a[], then 0 swaps required
      if (x >= maxOccur)
      {
        return 0;
      }
 
      // maxOccur - x is the count
      // of swaps needed to make
      // c[i] the majority element
      else
      {
        res = Math.min(res,
                       maxOccur - x);
      }
    }
  }
 
  // If not possible
  if (res == Integer.MAX_VALUE)
  {
    return -1;
  }
 
  // Otherwise
  else
    return res;
}
 
// Driver code
public static void main(String[] args)
{
  // Given arrays a[] and b[]
  int arr[] = {3, 2, 1, 4, 9};
  int brr[] = {5, 5, 3, 5, 3};
 
  int N = arr.length;
 
  // Function Call
  System.out.println(minMoves(arr, brr, N));
}
}
 
// This code is contributed by divyeshrabadiya07

Python3




# Python3 program for the above approach
from math import ceil, floor
import sys
 
# Function that counts the minimum
# number of swaps required to make
# half of the element same in a[]
def minMoves(a, b, n):
     
    # Stores frequency of elements in a[]
    # Stores frequency of elements in b[]
    A, B = {}, {}
     
    # Stores all elements from both arrays
    c = []
     
    # Find the maximum occurrence
    # required
    maxOccur = ceil(floor(n) / (2 * 1.0))
     
    for i in range(n):
        c.append(a[i])
        c.append(b[i])
 
        A[a[i]] = A.get(a[i], 0) + 1
         
        # If a[i] == b[i], then no need
        # of incrementing in map B
        if (b[i] != a[i]):
            B[b[i]] = B.get(b[i], 0) + 1
             
    # Store the minimum number of swaps
    res = sys.maxsize
     
    for i in range(len(c)):
         
        # Frequency of c[i] in array a
        x, y = 0, 0
        if c[i] in A:
            x = A]
             
        # Frequency of c[i] in array b
        if c[i] in B:
            y = B]
 
        # Check the frequency condition
        if ((x + y) >= maxOccur):
             
            # If c[i] is present at
            # least half times in array
            # a[], then 0 swaps required
            if (x >= maxOccur):
                return 0
                 
            # maxOccur - x is the count
            # of swaps needed to make
            # c[i] the majority element
            else:
                res = min(res, maxOccur - x)
                 
    # If not possible
    if (res == sys.maxsize):
        return -1
 
    # Otherwise
    else:
        return res
         
# Driver Code
if __name__ == '__main__':
     
    # Given arrays a[] and b[]
    arr = [ 3, 2, 1, 4, 9 ]
    brr = [ 5, 5, 3, 5, 3 ]
 
    N = len(arr)
 
    # Function Call
    print(minMoves(arr, brr, N))
 
# This code is contributed by mohit kumar 29

C#




// C# program for the
// above approach
using System;
using System.Collections.Generic;
 
class GFG{
     
// Function that counts the minimum
// number of swaps required to make
// half of the element same in []a
public static int minMoves(int []a,
                           int []b,
                           int n)
{
   
  // Stores frequency of elements
  // in []a
  // Stores frequency of elements
  // in []b
  Dictionary<int,
             int> A = new Dictionary<int,
                                     int>();
  Dictionary<int,
             int> B = new Dictionary<int,
                                     int>();
   
  // Stores all elements from
  // both arrays
  List<int> c = new List<int>();
 
  // Find the maximum occurrence
  // required
  int maxOccur = (int)(Math.Ceiling(
                 (int)(Math.Floor(
                 (double)n)) / (2 * 1.0)));
 
  for(int i = 0; i < n; ++i)
  {
    c.Add(a[i]);
    c.Add(b[i]);
 
    if (A.ContainsKey(a[i]))
    {
      A[a[i]] = A[a[i]] + 1;
    }
    else
    {
      A.Add(a[i], 1);
    }
 
    // If a[i] == b[i], then no need
    // of incrementing in map B
    if (b[i] != a[i])
    {
      if (B.ContainsKey(b[i]))
      {
        B[b[i]]++;
      }
      else
      {
        B.Add(b[i], 1);
      }
    }
  }
 
  // Store the minimum number
  // of swaps
  int res = int.MaxValue;
 
  for(int i = 0; i < c.Count; ++i)
  {
     
    // Frequency of c[i] in array a
    int x = 0;
    if (A.ContainsKey(c[i]))
    {
      x = A];  
    }
 
    // Frequency of c[i] in array b
    int y = 0;
    if (B.ContainsKey(c[i]))
    {
      y = B];  
    }
 
    // Check the frequency
    // condition
    if ((x + y) >= maxOccur)
    {
       
      // If c[i] is present at
      // least half times in array
      // []a, then 0 swaps required
      if (x >= maxOccur)
      {
        return 0;
      }
 
      // maxOccur - x is the count
      // of swaps needed to make
      // c[i] the majority element
      else
      {
        res = Math.Min(res,
                       maxOccur - x);
      }
    }
  }
 
  // If not possible
  if (res == int.MaxValue)
  {
    return -1;
  }
 
  // Otherwise
  else
    return res;
}
 
// Driver code
public static void Main(String[] args)
{
   
  // Given arrays []a and []b
  int []arr = { 3, 2, 1, 4, 9 };
  int []brr = { 5, 5, 3, 5, 3 };
   
  int N = arr.Length;
 
  // Function Call
  Console.WriteLine(minMoves(arr, brr, N));
}
}
 
// This code is contributed by Princi Singh

Javascript




<script>
 
// Javascript program for the above approach
 
// Function that counts the minimum
// number of swaps required to make
// half of the element same in a[]
function minMoves(a, b, n)
{
 
    // Stores frequency of elements in a[]
    // Stores frequency of elements in b[]
    var A = new Map(), B = new Map();
 
    // Stores all elements from both arrays
    var c = [];
 
    // Find the maximum occurrence
    // required
    var maxOccur = Math.ceil(Math.floor(n)
                        / (2 * 1.0));
 
    for (var i = 0; i < n; ++i) {
 
        c.push(a[i]);
        c.push(b[i]);
 
        if(A.has(a[i]))
        {
            A.set(a[i], A.get(a[i])+1);
        }
        else
        {
            A.set(a[i], 1);
        }
 
        // If a[i] == b[i], then no need
        // of incrementing in map B
        if (b[i] != a[i]) {
            if(B.has(b[i]))
            {
                B.set(b[i], B.get(b[i])+1);
            }
            else
            {
                B.set(b[i], 1);
            }
 
        }
    }
 
    // Store the minimum number of swaps
    var res = 1000000000;
 
    for (var i = 0; i < c.length; ++i) {
        // Frequency of c[i] in array a
        var x = A.get(c[i]);
 
        // Frequency of c[i] in array b
        var y = B.get(c[i]);
 
        // Check the frequency condition
        if ((x + y) >= maxOccur) {
 
            // if c[i] is present at
            // least half times in array
            // a[], then 0 swaps required
            if (x >= maxOccur) {
                return 0;
            }
 
            // maxOccur - x is the count
            // of swaps needed to make
            // c[i] the majority element
            else {
                res = Math.min(res, maxOccur - x);
            }
        }
    }
 
    // If not possible
    if (res == 1000000000) {
        return -1;
    }
 
    // Otherwise
    else
        return res;
}
 
// Driver Code
// Given arrays a[] and b[]
var arr = [3, 2, 1, 4, 9];
var brr = [5, 5, 3, 5, 3];
var N = arr.length;
// Function Call
document.write( minMoves(arr, brr, N));
 
</script>
Output: 
2

 

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

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.




My Personal Notes arrow_drop_up
Recommended Articles
Page :