给定两个分别为M和N的数组arr1 []和arr2 [] 。两个数组均处于算术级数中,并且两个数组的第一个元素相同。任务是找到arr1 []和arr2 []中公共元素的数量。
例子:
Input: arr1[] = {2, 3, 4, 5, 6}, arr2[] = {2, 4, 6, 8, 10}
Output: 3
Explanation:
Common elements are {2, 4, 6}
Input: arr1[] = {1, 4, 7, 10, 13, 16}, arr2[] = {1, 3, 5, 7, 9}
Output: 2
Explanation:
Common elements are {1, 7}
建议:在继续解决方案之前,请先在{IDE}上尝试使用您的方法。
方法:这个想法是使用两个算术级数的公共差的最小公倍数来解决这个问题。下面是步骤说明:
- 在以下公式的帮助下找到两种算术级数的共同区别
diff1 = arr1[1] - arr1[0]
diff2 = arr2[1] - arr2[0]
- 找出两个算术级数的公共差的最小公倍数。
- 在两个算术级数中可能使用的共同元素将是算术级数与第一个元素的最后一个元素的差除以共同差的LCM。
elements1 = (arr1[m-1] - arr1[0]) / LCM(diff1, diff2)
elements2 = (arr2[n-1] - arr2[0]) / LCM(diff1, diff2)
// Common Elements
ans = min(elements, elements2)
下面是上述方法的实现:
C++
// C++ implementation to count the
// common elements of the two arithmetic
// progression of the given sequence
#include
using namespace std;
// Function to find GCD
int gcd(int a,int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Function to find LCM
int findlcm(int a, int b)
{
int gc = gcd(a, b);
return a * b / gc;
}
// Function to count common element
// of arr1[] and arr2[]
int CountCommon(int arr1[], int arr2[],
int m, int n)
{
// Common Difference
int diff1 = arr1[1] - arr1[0];
int diff2 = arr2[1] - arr2[0];
// Function calling
int lcm = findlcm(diff1, diff2);
int ans1 = (arr1[m - 1] - arr1[0]) / lcm;
int ans2 = (arr2[n - 1] - arr2[0]) / lcm;
int ans = min(ans1, ans2);
return (ans + 1);
}
// Driver code
int main()
{
int arr1[] = { 2, 5, 8, 11, 14, 17 };
int arr2[] = { 2, 4, 6, 8, 10, 12 };
int m = sizeof(arr1) / sizeof(arr1[0]);
int n = sizeof(arr2) / sizeof(arr2[0]);
// Function calling
cout << CountCommon(arr1, arr2, m, n);
return 0;
}
// This code is contributed by amal kumar choubey
Java
// Java implementation to count the
// common elements of the two arithmetic
// progression of the given sequence
import java.util.*;
class GFG{
// Function to find GCD
static int gcd(int a,int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Function to find LCM
static int findlcm(int a, int b)
{
int gc = gcd(a, b);
return a * b / gc;
}
// Function to count common element
// of arr1[] and arr2[]
static int CountCommon(int []arr1,
int []arr2,
int m, int n)
{
// Common Difference
int diff1 = arr1[1] - arr1[0];
int diff2 = arr2[1] - arr2[0];
// Function calling
int lcm = findlcm(diff1, diff2);
int ans1 = (arr1[m - 1] - arr1[0]) / lcm;
int ans2 = (arr2[n - 1] - arr2[0]) / lcm;
int ans = Math.min(ans1, ans2);
return (ans + 1);
}
// Driver code
public static void main(String args[])
{
int []arr1 = { 2, 5, 8, 11, 14, 17 };
int []arr2 = { 2, 4, 6, 8, 10, 12 };
int m = arr1.length;
int n = arr2.length;
// Function calling
System.out.print(CountCommon(arr1, arr2, m, n));
}
}
// This code is contributed by Nidhi_biet
Python3
# Python3 implementation to count the
# common elements of the two arithmetic
# progression of the given sequence
# Function to find GCD
def gcd(a, b):
if b == 0:
return a
return gcd(b, a % b)
# Function to find LCM
def findlcm(a, b):
return a * b // gcd(a, b)
# Function to count Common Element
# of arr1[] and arr2[]
def CountCommon(arr1, arr2, m, n):
# Common Difference
diff1 = arr1[1] - arr1[0]
diff2 = arr2[1] - arr2[0]
# Function calling
lcm = findlcm(diff1, diff2)
ans1 = (arr1[m - 1] - arr1[0]) // lcm
ans2 = (arr2[n - 1] - arr2[0]) // lcm
ans = min(ans1, ans2)
# Print the total Common Element
print (ans + 1)
# Driver Code
if __name__ == "__main__":
arr1 = [ 2, 5, 8, 11, 14, 17 ]
arr2 = [ 2, 4, 6, 8, 10, 12 ]
m = len(arr1)
n = len(arr2)
# Function calling
CountCommon(arr1, arr2, m, n)
C#
// C# implementation to count the
// common elements of the two arithmetic
// progression of the given sequence
using System;
class GFG{
// Function to find GCD
static int gcd(int a,int b)
{
if (b == 0)
return a;
return gcd(b, a % b);
}
// Function to find LCM
static int findlcm(int a, int b)
{
int gc = gcd(a, b);
return a * b / gc;
}
// Function to count common element
// of arr1[] and arr2[]
int CountCommon(int []arr1,
int []arr2,
int m, int n)
{
// Common Difference
int diff1 = arr1[1] - arr1[0];
int diff2 = arr2[1] - arr2[0];
// Function calling
int lcm = findlcm(diff1, diff2);
int ans1 = (arr1[m - 1] - arr1[0]) / lcm;
int ans2 = (arr2[n - 1] - arr2[0]) / lcm;
int ans = min(ans1, ans2);
return (ans + 1);
}
// Driver code
public static void Main()
{
int []arr1 = { 2, 5, 8, 11, 14, 17 };
int []arr2 = { 2, 4, 6, 8, 10, 12 };
int m = arr1.Length;
int n = arr2.Length;
// Function calling
Console.Write(CountCommon(arr1, arr2, m, n));
}
}
// This code is contributed by Code_Mech
Javascript
输出:
2
时间复杂度: O(log(max(diff1,diff2)))