给定两个大小分别为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)))
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live