Java Program to Maximize count of corresponding same elements in given Arrays by Rotation

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:Â
Â
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 + "");}  // 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 |
5
Â
Time Complexity: O(N)Â
Auxiliary Space: O(N)
Â
Please refer complete article on Maximize count of corresponding same elements in given Arrays by Rotation for more details!



