📜  合并两个数组(例如保留顺序)的方式数量

📅  最后修改于: 2021-05-06 17:18:51             🧑  作者: Mango

给定大小为n和m的两个数组。我们的任务是找到将给定数组合并为一个数组的方式,以使每个数组的元素顺序不变。

例子:

Input : n = 2, m = 2
Output : 6
Let first array of size n = 2 be [1, 2] and second array of size m = 2 be [3, 4].
So, possible merged array of n + m elements can be:
[1, 2, 3, 4]
[1, 3, 2, 4]
[3, 4, 1, 2]
[3, 1, 4, 2]
[1, 3, 4, 2]
[3, 1, 2, 4]
 
Input : n = 4, m = 6
Output : 210

这个想法是使用组合学的概念。假设我们有两个数组A {a1,a2,…。,am}和B {b1,b2,…。,bn}分别具有m和n个元素,现在我们必须合并它们而不丢失其顺序。
合并后,我们知道合并后元素的总数将为(m + n)个元素。因此,现在我们只需要从(m + n)中选择m个位置的方法,即可将数组A的元素按其实际顺序放置,即m + n C n
放置数组A的m个元素后,将保留n个空格,可以按其实际顺序由B数组的n个元素填充。
因此,合并两个数组以使它们在合并数组中的顺序相同的方式总数为m + n C n

以下是此方法的实现:

C++
// CPP Program to find number of ways
// to merge two array such that their 
// order in merged array is same
#include 
using namespace std;
  
// function to find the binomial coefficient
int binomialCoeff(int n, int k)
{
    int C[k + 1];
    memset(C, 0, sizeof(C));
  
    C[0] = 1; // nC0 is 1
  
    for (int i = 1; i <= n; i++) {
  
        // Compute next row of pascal triangle 
        // using the previous row
        for (int j = min(i, k); j > 0; j--)
            C[j] = C[j] + C[j - 1];
    }
    return C[k];
}
  
// function to find number of ways 
// to merge two array such that their 
// order in merged array is same
int numOfWays(int n, int m)
{
    return binomialCoeff(m + n, m);
}
  
// Driven Program
int main()
{
    int n = 2, m = 2;
    cout << numOfWays(n, m) << endl;
    return 0;
}


Java
// Java Program to find number of ways
// to merge two array such that their 
// order in merged array is same
  
import java.io.*;
  
class GFG {
      
    // function to find the binomial 
    // coefficient
    static int binomialCoeff(int n, int k)
    {
        int C[] = new int[k + 1];
        // memset(C, 0, sizeof(C));
      
        C[0] = 1; // nC0 is 1
      
        for (int i = 1; i <= n; i++) {
      
            // Compute next row of pascal 
            // triangle using the previous
            // row
            for (int j = Math.min(i, k);
                               j > 0; j--)
                C[j] = C[j] + C[j - 1];
        }
          
        return C[k];
    }
      
    // function to find number of ways 
    // to merge two array such that their 
    // order in merged array is same
    static int numOfWays(int n, int m)
    {
        return binomialCoeff(m + n, m);
    }
      
    // Driven Program
    public static void main (String[] args)
    {
        int n = 2, m = 2;
        System.out.println(numOfWays(n, m));
    }
}
  
// This code is contributed by anuj_67.


Python3
# Python 3 Program to find number of ways
# to merge two array such that their 
# order in merged array is same
  
# function to find the binomial coefficient
def binomialCoeff(n, k):
    C = [0 for i in range(k + 1)]
  
    C[0] = 1
  
    for i in range(1, n + 1, 1):
          
        # Compute next row of pascal 
        # triangle using the previous row
        j = min(i, k)
        while(j > 0):
            C[j] = C[j] + C[j - 1]
            j -= 1
  
    return C[k]
  
# function to find number of ways 
# to merge two array such that their 
# order in merged array is same
def numOfWays(n, m):
    return binomialCoeff(m + n, m)
  
# Driver Code
if __name__ == '__main__':
    n = 2
    m = 2
    print(numOfWays(n, m))
      
# This code is contributed by
# Sahil_shelangia


C#
// C# Program to find number of ways
// to merge two array such that their 
// order in merged array is same
  
using System;
  
class GFG {
      
    // function to find the binomial 
    // coefficient
    static int binomialCoeff(int n, int k)
    {
        int []C = new int[k + 1];
        // memset(C, 0, sizeof(C));
      
        C[0] = 1; // nC0 is 1
      
        for (int i = 1; i <= n; i++) {
      
            // Compute next row of pascal 
            // triangle using the previous
            // row
            for (int j = Math.Min(i, k);
                            j > 0; j--)
                C[j] = C[j] + C[j - 1];
        }
          
        return C[k];
    }
      
    // function to find number of ways 
    // to merge two array such that their 
    // order in merged array is same
    static int numOfWays(int n, int m)
    {
        return binomialCoeff(m + n, m);
    }
      
    // Driven Program
    public static void Main ()
    {
        int n = 2, m = 2;
        Console.WriteLine(numOfWays(n, m));
    }
}
  
// This code is contributed by anuj_67.


PHP
 0; $j--) 
            $C[$j] = $C[$j] + $C[$j - 1 ]; 
    } 
    return $C[$k]; 
} 
  
// function to find number of ways 
// to merge two array such that their 
// order in merged array is same 
function numOfWays( $n, $m) 
{ 
    return binomialCoeff($m + $n, $m); 
} 
  
    $n = 2; $m = 2; 
    echo numOfWays($n, $m); 
   //This code is contributed by Rajput-Ji.
?>


输出:
6

我们可以使用二项式系数的线性时间实现来解决上述线性时间问题。