给定 2 个数组A[]和B[]以及一个整数M 。任务是找到X的最小值,使得在将数组的所有元素更改为(arr[i] + X)%M后, A[]的所有元素的频率与A[]的所有元素的频率相同乙[] 。如果找不到X 的任何值,则打印“-1” 。
例子:
Input: M = 3, A[] = {0, 0, 2, 1}, B[] = {2, 0, 1, 1}
Output: 1
Explanation:
On taking x = 1 the numbers are changed to:
(0 + 1) % 3 = 1
(0 + 1) % 3 = 1
(2 + 1) % 3 = 0
(1 + 1) % 3 = 2
Hence on rearranging 1, 1, 0, 2 to 2, 0, 1, 1, array B[] is obtained.
Input: M = 887, A[] = {4625, 5469, 2038, 5916}, B[] = {744, 211, 795, 695}
Output: -1
Explanation:
The conversion of A[] to B[] is not possible.
方法: X 的可能值将在[0, M]范围内,因为范围 M 之后的值将给出我们对 M 进行模运算的相同结果。以下是步骤:
- 创建数组B[]的频率数组(比如freqB[] )。
- 现在,迭代范围[0, M] 中所有可能的X值并执行以下操作:
- 对于上述范围内的每个 X 值,将数组A[]更新为(arr[i] + X)%M 。
- 创建数组A[]的频率数组(比如freqA[] )。
- 如果数组freqA[]和freqB[]的频率相同,则打印X 的这个值。
- 否则检查X 的另一个值。
- 在上述步骤之后,如果我们没有找到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 现场工作专业课程和学生竞争性编程现场课程。