📌  相关文章
📜  根据给定条件必须添加每个 Array 元素的最小值

📅  最后修改于: 2021-10-27 06:52:51             🧑  作者: Mango

给定 2 个数组A[]B[]以及一个整数M 。任务是找到X的最小值,使得在将数组的所有元素更改为(arr[i] + X)%M后, A[]的所有元素的频率与A[]的所有元素的频率相同乙[] 。如果找不到X 的任何值,则打印“-1”

例子:

方法: X 的可能值将在[0, M]范围内因为范围 M 之后的值将给出我们对 M 进行模运算的相同结果。以下是步骤:

  1. 创建数组B[]的频率数组(比如freqB[] )。
  2. 现在,迭代范围[0, M] 中所有可能的X值并执行以下操作:
    • 对于上述范围内的每个 X 值,将数组A[]更新为(arr[i] + X)%M
    • 创建数组A[]的频率数组(比如freqA[] )。
    • 如果数组freqA[]freqB[]的频率相同,则打印X 的这个值。
    • 否则检查X 的另一个值。
  3. 在上述步骤之后,如果我们没有找到X的值,则打印“-1”

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to find minimum value of X
int findX(int n, int m,
          int ar1[], int ar2[])
{
    // Create a frequency array for B[]
    int freq2[m] = { 0 };
 
    for (int i = 0; i < n; i++) {
        freq2[ar2[i]]++;
    }
 
    // Initialize x = -1
    int x = -1;
 
    // Loop from [0 to m-1]
    for (int i = 0; i < m; i++) {
 
        int cnt = 0;
        int freq1[m] = { 0 };
 
        // Create a frequency array
        // for fixed x for all ar[i]
        for (int j = 0; j < n; j++) {
 
            freq1[(ar1[j] + i) % m]++;
        }
 
        bool flag = true;
 
        // Comparing freq1[] and freq2[]
        for (int k = 0; k < m; k++) {
 
            if (freq1[k] != freq2[k]) {
                flag = false;
                break;
            }
        }
 
        // If condition is satisfied
        // then break out from loop
        if (flag) {
            x = i;
            break;
        }
    }
 
    // Return the answer
    return x;
}
 
// Driver Code
int main()
{
    // Given value of M
    int M = 3;
 
    // Given arrays ar1[] and ar2[]
    int ar1[] = { 0, 0, 2, 1 };
    int ar2[] = { 2, 0, 1, 1 };
 
    int N = sizeof arr1 / sizeof arr1[0];
 
    cout << findX(N, M, ar1, ar2) << '\n';
 
    return 0;
}


Java
// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Function to find minimum value of X
static int findX(int n, int m,
                 int ar1[], int ar2[])
{
     
    // Create a frequency array for B[]
    int freq2[] = new int [m];
    for(int i = 0; i < m; i++)
        freq2[i] = 0;
         
    for(int i = 0; i < n; i++)
    {
        freq2[ar2[i]]++;
    }
 
    // Initialize x = -1
    int x = -1;
 
    // Loop from [0 to m-1]
    for(int i = 0; i < m; i++)
    {
        int cnt = 0;
        int freq1[] = new int [m];
         
        for(int j = 0; j < m; j++)
        {
            freq1[j] = 0;
        }
         
        // Create a frequency array
        // for fixed x for all ar[i]
        for(int j = 0; j < n; j++)
        {
            freq1[(ar1[j] + i) % m]++;
        }
 
        boolean flag = true;
         
        // Comparing freq1[] and freq2[]
        for(int k = 0; k < m; k++)
        {
            if (freq1[k] != freq2[k])
            {
                flag = false;
                break;
            }
        }
 
        // If condition is satisfied
        // then break out from loop
        if (flag)
        {
            x = i;
            break;
        }
    }
 
    // Return the answer
    return x;
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Given value of M
    int M = 3;
 
    // Given arrays ar1[] and ar2[]
    int ar1[] = { 0, 0, 2, 1 };
    int ar2[] = { 2, 0, 1, 1 };
     
    int N = ar1.length;
     
    System.out.println(findX(N, M, ar1, ar2));
}
}
 
// This code is contributed by Stream_Cipher


Python3
# Python3 program for
# the above approach
 
# Function to find
# minimum value of X
def findX(n, m,
          ar1, ar2):
 
    # Create a frequency
    # array for B[]
    freq2 = [0] * m
 
    for i in range(n):
        freq2[ar2[i]] += 1
   
    # Initialize x = -1
    x = -1
 
    # Loop from [0 to m - 1]
    for i in range(m):
        cnt = 0
        freq1 = [0] * m
 
        # Create a frequency array
        # for fixed x for all ar[i]
        for j in range(n):
            freq1[(ar1[j] + i) % m] += 1
        
        flag = True
 
        # Comparing freq1[]
        # and freq2[]
        for k in range(m):
            if (freq1[k] != freq2[k]):
                flag = False
                break
      
        # If condition is satisfied
        # then break out from loop
        if (flag):
            x = i
            break
 
    # Return the answer
    return x
 
# Driver Code
if __name__ == "__main__":
   
    # Given value of M
    M = 3
 
    # Given arrays ar1[]
    # and ar2[]
    ar1 = [0, 0, 2, 1]
    ar2 = [2, 0, 1, 1]
 
    N = len(ar1)
    print (findX(N, M, ar1, ar2))
     
# This code is contributed by Chitranayal


C#
// C# program for the above approach
using System;
class GFG
{
 
  // Function to find minimum value of X
  static int findX(int n, int m,int []ar1 ,int []ar2)
  {
 
    // Create a frequency array for B[]
    int []freq2 = new int [m];
    for(int i = 0; i < m; i++)
      freq2[i] = 0;
 
    for(int i = 0; i < n; i++)
    {
      freq2[ar2[i]]++;
    }
 
    // Initialize x = -1
    int x = -1;
 
    // Loop from [0 to m-1]
    for(int i = 0; i < m; i++)
    {
      int cnt = 0;
      int []freq1 = new int [m];       
      for(int j = 0; j < m; j++)
      {
        freq1[j] = 0;
      }
 
      // Create a frequency array
      // for fixed x for all ar[i]
      for(int j = 0; j < n; j++)
      {
        freq1[(ar1[j] + i) % m]++;
      }
 
      Boolean flag = true;
 
      // Comparing freq1[] and freq2[]
      for(int k = 0; k < m; k++)
      {
        if (freq1[k] != freq2[k])
        {
          flag = false;
          break;
        }
      }
 
      // If condition is satisfied
      // then break out from loop
      if (flag)
      {
        x = i;
        break;
      }
    }
 
    // Return the answer
    return x;
  }
 
  // Driver Code
  public static void Main(String[] args)
  {
 
    // Given value of M
    int M = 3;
 
    // Given arrays ar1[] and ar2[]
    int []ar1 = { 0, 0, 2, 1 };
    int []ar2 = { 2, 0, 1, 1 };
 
    int N = ar1.Length;
    Console.Write(findX(N, M, ar1, ar2));
  }
}
 
// This code is contributed by shivanisinghss2110


Javascript


输出:
1

时间复杂度: O(N*M),其中 N 是数组中元素数, M 是整数。
辅助空间: O(N)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程