Given two arrays arr1[] and arr2[] of N integers and array arr1[] has distinct elements. The task is to find the maximum count of corresponding same elements in the given arrays by performing cyclic left or right shift on array arr1[].
Examples:
Input: arr1[] = { 6, 7, 3, 9, 5 }, arr2[] = { 7, 3, 9, 5, 6 }
Output: 5
Explanation:
By performing cyclic left shift on array arr1[] by 1.
Updated array arr1[] = {7, 3, 9, 5, 6}.
This rotation contains a maximum number of equal elements between array arr1[] and arr2[].
Input: arr1[] = {1, 3, 2, 4}, arr2[] = {4, 2, 3, 1}
Output: 2
Explanation:
By performing cyclic left shift on array arr1[] by 1.
Updated array arr1[] = {3, 2, 4, 1}
This rotation contains a maximum number of equal elements between array arr1[] and arr2[].
Approach: This problem can be solved using Greedy Approach. Below are the steps:
- Store the position of all the elements of the array arr2[] in an array(say store[]).
- For each element in the array arr1[], do the following:
- Find the difference(say diff) between the position of the current element in arr2[] with the position in arr1[].
- If diff is less than 0 then update diff to (N – diff).
- Store the frequency of current difference diff in a map.
- After the above steps, the maximum frequency stored in map is the maximum number of equal elements after rotation on arr1[].
Below is the implementation of the above approach:
C++
// C++ program of the above approach#include <bits/stdc++.h>using namespace std;// Function that prints maximum// equal elementsvoid maximumEqual(int a[], int b[], int n){ // Vector to store the index // of elements of array b vector<int> store(1e5); // Storing the positions of // array B for (int i = 0; i < n; i++) { store[b[i]] = i + 1; } // frequency array to keep count // of elements with similar // difference in distances vector<int> ans(1e5); // Iterate through all element in arr1[] for (int i = 0; i < n; i++) { // Calculate number of // shift required to // make current element // equal int d = abs(store[a[i]] - (i + 1)); // If d is less than 0 if (store[a[i]] < i + 1) { d = n - d; } // Store the frequency // of current diff ans[d]++; } int finalans = 0; // Compute the maximum frequency // stored for (int i = 0; i < 1e5; i++) finalans = max(finalans, ans[i]); // Printing the maximum number // of equal elements cout << finalans << "\n";}// Driver Codeint main(){ // Given two arrays int A[] = { 6, 7, 3, 9, 5 }; int B[] = { 7, 3, 9, 5, 6 }; int size = sizeof(A) / sizeof(A[0]); // Function Call maximumEqual(A, B, size); return 0;} |
Java
// Java program of the above approachimport java.util.*;class GFG{// Function that prints maximum// equal elementsstatic void maximumEqual(int a[], int b[], int n){ // Vector to store the index // of elements of array b int store[] = new int[(int) 1e5]; // Storing the positions of // array B for (int i = 0; i < n; i++) { store[b[i]] = i + 1; } // frequency array to keep count // of elements with similar // difference in distances int ans[] = new int[(int) 1e5]; // Iterate through all element in arr1[] for (int i = 0; i < n; i++) { // Calculate number of // shift required to // make current element // equal int d = Math.abs(store[a[i]] - (i + 1)); // If d is less than 0 if (store[a[i]] < i + 1) { d = n - d; } // Store the frequency // of current diff ans[d]++; } int finalans = 0; // Compute the maximum frequency // stored for (int i = 0; i < 1e5; i++) finalans = Math.max(finalans, ans[i]); // Printing the maximum number // of equal elements System.out.print(finalans + "\n");}// Driver Codepublic static void main(String[] args){ // Given two arrays int A[] = { 6, 7, 3, 9, 5 }; int B[] = { 7, 3, 9, 5, 6 }; int size = A.length; // Function Call maximumEqual(A, B, size);}}// This code is contributed by sapnasingh4991 |
Python3
# Python3 program for the above approach# Function that prints maximum# equal elementsdef maximumEqual(a, b, n): # List to store the index # of elements of array b store = [0] * 10 ** 5 # Storing the positions of # array B for i in range(n): store[b[i]] = i + 1 # Frequency array to keep count # of elements with similar # difference in distances ans = [0] * 10 ** 5 # Iterate through all element # in arr1[] for i in range(n): # Calculate number of shift # required to make current # element equal d = abs(store[a[i]] - (i + 1)) # If d is less than 0 if (store[a[i]] < i + 1): d = n - d # Store the frequency # of current diff ans[d] += 1 finalans = 0 # Compute the maximum frequency # stored for i in range(10 ** 5): finalans = max(finalans, ans[i]) # Printing the maximum number # of equal elements print(finalans)# Driver Codeif __name__ == '__main__': # Given two arrays A = [ 6, 7, 3, 9, 5 ] B = [ 7, 3, 9, 5, 6 ] size = len(A) # Function Call maximumEqual(A, B, size)# This code is contributed by Shivam Singh |
C#
// C# program of the above approachusing System;class GFG{// Function that prints maximum// equal elementsstatic void maximumEqual(int[] a, int[] b, int n){ // Vector to store the index // of elements of array b int[] store = new int[(int) 1e5]; // Storing the positions of // array B for(int i = 0; i < n; i++) { store[b[i]] = i + 1; } // Frequency array to keep count // of elements with similar // difference in distances int[] ans = new int[(int) 1e5]; // Iterate through all element in arr1[] for(int i = 0; i < n; i++) { // Calculate number of // shift required to // make current element // equal int d = Math.Abs(store[a[i]] - (i + 1)); // If d is less than 0 if (store[a[i]] < i + 1) { d = n - d; } // Store the frequency // of current diff ans[d]++; } int finalans = 0; // Compute the maximum frequency // stored for(int i = 0; i < 1e5; i++) finalans = Math.Max(finalans, ans[i]); // Printing the maximum number // of equal elements Console.Write(finalans + "\n");}// Driver Codepublic static void Main(){ // Given two arrays int[]A = { 6, 7, 3, 9, 5 }; int[]B = { 7, 3, 9, 5, 6 }; int size = A.Length; // Function Call maximumEqual(A, B, size);}}// This code is contributed by chitranayal |
Javascript
<script>// JavaScript program of the above approach// Function that prints maximum// equal elementsfunction maximumEqual(a, b, n){ // Vector to store the index // of elements of array b let store = Array.from({length: 1e5}, (_, i) => 0); // Storing the positions of // array B for (let i = 0; i < n; i++) { store[b[i]] = i + 1; } // frequency array to keep count // of elements with similar // difference in distances let ans = Array.from({length: 1e5}, (_, i) => 0); // Iterate through all element in arr1[] for (let i = 0; i < n; i++) { // Calculate number of // shift required to // make current element // equal let d = Math.abs(store[a[i]] - (i + 1)); // If d is less than 0 if (store[a[i]] < i + 1) { d = n - d; } // Store the frequency // of current diff ans[d]++; } let finalans = 0; // Compute the maximum frequency // stored for (let i = 0; i < 1e5; i++) finalans = Math.max(finalans, ans[i]); // Printing the maximum number // of equal elements document.write(finalans + "\n");}// Driver Code // Given two arrays let A = [ 6, 7, 3, 9, 5 ]; let B = [ 7, 3, 9, 5, 6 ]; let size = A.length; // Function Call maximumEqual(A, B, size); </script> |
5
Time Complexity: O(N)
Auxiliary Space: O(N)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Info to that Topic: geeksforgeeks.org/maximize-count-of-corresponding-same-elements-in-given-arrays-by-rotation/ […]