给定一个数组列表,找到所有组合,其中每个组合包含每个给定数组中的一个元素。
例子:
Input : [ [1, 2], [3, 4] ]
Output : 1 3
1 4
2 3
2 4
Input : [ [1], [2, 3, 4], [5] ]
Output : 1 2 5
1 3 5
1 4 5
我们保持大小等于数组总数的数组。这个称为索引的数组可帮助我们跟踪n个数组中每个数组中当前元素的索引。最初,它用全0初始化,表示每个数组中的当前索引是第一个元素的索引。我们会继续打印组合,直到找不到新的组合。从最右边的数组开始,我们检查该数组中是否还有更多元素。如果是,我们将以索引的形式增加该数组的条目,即移至该数组中的下一个元素。我们还使该数组右边所有数组中的当前索引为0。我们一直向左移动以检查所有阵列,直到找到一个这样的阵列。如果找不到更多的数组,我们就到此为止。
C++
// C++ program to find combinations from n
// arrays such that one element from each
// array is present
#include
using namespace std;
// function to print combinations that contain
// one element from each of the given arrays
void print(vector >& arr)
{
// number of arrays
int n = arr.size();
// to keep track of next element in each of
// the n arrays
int* indices = new int[n];
// initialize with first element's index
for (int i = 0; i < n; i++)
indices[i] = 0;
while (1) {
// print current combination
for (int i = 0; i < n; i++)
cout << arr[i][indices[i]] << " ";
cout << endl;
// find the rightmost array that has more
// elements left after the current element
// in that array
int next = n - 1;
while (next >= 0 &&
(indices[next] + 1 >= arr[next].size()))
next--;
// no such array is found so no more
// combinations left
if (next < 0)
return;
// if found move to next element in that
// array
indices[next]++;
// for all arrays to the right of this
// array current index again points to
// first element
for (int i = next + 1; i < n; i++)
indices[i] = 0;
}
}
// driver function to test above function
int main()
{
// initializing a vector with 3 empty vectors
vector > arr(3, vector(0, 0));
// now entering data
// [[1, 2, 3], [4], [5, 6]]
arr[0].push_back(1);
arr[0].push_back(2);
arr[0].push_back(3);
arr[1].push_back(4);
arr[2].push_back(5);
arr[2].push_back(6);
print(arr);
}
Java
// Java program to find combinations from n
// arrays such that one element from each
// array is present
import java.util.*;
class GFG{
// Function to print combinations that contain
// one element from each of the given arrays
static void print(Vector []arr)
{
// Number of arrays
int n = arr.length;
// To keep track of next element in
// each of the n arrays
int []indices = new int[n];
// Initialize with first element's index
for(int i = 0; i < n; i++)
indices[i] = 0;
while (true)
{
// Print current combination
for(int i = 0; i < n; i++)
System.out.print(
arr[i].get(indices[i]) + " ");
System.out.println();
// Find the rightmost array that has more
// elements left after the current element
// in that array
int next = n - 1;
while (next >= 0 &&
(indices[next] + 1 >=
arr[next].size()))
next--;
// No such array is found so no more
// combinations left
if (next < 0)
return;
// If found move to next element in that
// array
indices[next]++;
// For all arrays to the right of this
// array current index again points to
// first element
for(int i = next + 1; i < n; i++)
indices[i] = 0;
}
}
// Driver code
public static void main(String[] args)
{
// Initializing a vector with 3 empty vectors
@SuppressWarnings("unchecked")
Vector []arr = new Vector[3];
for(int i = 0; i < arr.length; i++)
arr[i] = new Vector();
// Now entering data
// [[1, 2, 3], [4], [5, 6]]
arr[0].add(1);
arr[0].add(2);
arr[0].add(3);
arr[1].add(4);
arr[2].add(5);
arr[2].add(6);
print(arr);
}
}
// This code is contributed by amal kumar choubey
Python3
# Python3 program to find combinations from n
# arrays such that one element from each
# array is present
# function to prcombinations that contain
# one element from each of the given arrays
def print1(arr):
# number of arrays
n = len(arr)
# to keep track of next element
# in each of the n arrays
indices = [0 for i in range(n)]
while (1):
# prcurrent combination
for i in range(n):
print(arr[i][indices[i]], end = " ")
print()
# find the rightmost array that has more
# elements left after the current element
# in that array
next = n - 1
while (next >= 0 and
(indices[next] + 1 >= len(arr[next]))):
next-=1
# no such array is found so no more
# combinations left
if (next < 0):
return
# if found move to next element in that
# array
indices[next] += 1
# for all arrays to the right of this
# array current index again points to
# first element
for i in range(next + 1, n):
indices[i] = 0
# Driver Code
# initializing a vector with 3 empty vectors
arr = [[] for i in range(3)]
# now entering data
# [[1, 2, 3], [4], [5, 6]]
arr[0].append(1)
arr[0].append(2)
arr[0].append(3)
arr[1].append(4)
arr[2].append(5)
arr[2].append(6)
print1(arr)
# This code is contributed by mohit kumar
C#
// C# program to find
// combinations from n
// arrays such that one
// element from each
// array is present
using System;
using System.Collections.Generic;
class GFG{
// Function to print combinations
// that contain one element from
// each of the given arrays
static void print(List []arr)
{
// Number of arrays
int n = arr.Length;
// To keep track of next
// element in each of
// the n arrays
int []indices = new int[n];
// Initialize with first
// element's index
for(int i = 0; i < n; i++)
indices[i] = 0;
while (true)
{
// Print current combination
for(int i = 0; i < n; i++)
Console.Write(arr[i][indices[i]] + " ");
Console.WriteLine();
// Find the rightmost array
// that has more elements
// left after the current
// element in that array
int next = n - 1;
while (next >= 0 &&
(indices[next] + 1 >=
arr[next].Count))
next--;
// No such array is found
// so no more combinations left
if (next < 0)
return;
// If found move to next
// element in that array
indices[next]++;
// For all arrays to the right
// of this array current index
// again points to first element
for(int i = next + 1; i < n; i++)
indices[i] = 0;
}
}
// Driver code
public static void Main(String[] args)
{
// Initializing a vector
// with 3 empty vectors
List []arr = new List[3];
for(int i = 0; i < arr.Length; i++)
arr[i] = new List();
// Now entering data
// [[1, 2, 3], [4], [5, 6]]
arr[0].Add(1);
arr[0].Add(2);
arr[0].Add(3);
arr[1].Add(4);
arr[2].Add(5);
arr[2].Add(6);
print(arr);
}
}
// This code is contributed by shikhasingrajput
输出:
1 4 5
1 4 6
2 4 5
2 4 6
3 4 5
3 4 6