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++ program of the above approach #include <bits/stdc++.h> using namespace std;
// Function that prints maximum // equal elements void 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 Code int 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 program of the above approach import java.util.*;
class GFG{
// Function that prints maximum // equal elements static 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 Code public 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 program for the above approach # Function that prints maximum # equal elements def 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 Code if __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# program of the above approach using System;
class GFG{
// Function that prints maximum // equal elements static 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 Code public 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 |
<script> // JavaScript program of the above approach // Function that prints maximum // equal elements function 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)