📌  相关文章
📜  计算两个数组中以算术级数表示的公共元素

📅  最后修改于: 2021-05-14 08:49:28             🧑  作者: Mango

给定两个分别为MN的数组arr1 []arr2 [] 。两个数组均处于算术级数中,并且两个数组的第一个元素相同。任务是找到arr1 []和arr2 []中公共元素的数量。
例子:

建议:在继续解决方案之前,请先在{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)))