给定大小R的阵列行[]其中行[i]是第i行的元素与尺寸为C的另一阵列列[]的总和,其中柱[i]是第i列的元素的总和。任务是检查是否有可能构造一个R * C维的二进制矩阵,该矩阵满足给定的行总和和列总和。二进制矩阵是仅填充0和1的矩阵。
总和是指特定行或列中1的数目。
例子:
Input: Row[] = {2, 2, 2, 2, 2}, Column[] = {5, 5, 0, 0}
Output: YES
Matrix is
{1, 1, 0, 0}
{1, 1, 0, 0}
{1, 1, 0, 0}
{1, 1, 0, 0}
{1, 1, 0, 0}
Input: Row[] = {0, 0, 3} Column[] = {3, 0, 0}
Output: NO
方法:
- 关键思想是矩阵中的任何单元格将对行和列之和做出同等贡献,因此所有行之和必须等于列之和。
- 现在,如果此值大于非零列总和的数量且不存在矩阵,则查找行总和的最大值。
- 如果列总和的最大值大于非零行总和的数目,则无法构造矩阵。
- 如果满足以上所有三个条件,则存在矩阵。
下面是上述方法的实现:
C++
// C++ implementation of the above approach
#include
using namespace std;
// Function to check if matrix exists
bool matrix_exist(int row[], int column[], int r, int c)
{
int row_sum = 0;
int column_sum = 0;
int row_max = -1;
int column_max = -1;
int row_non_zero = 0;
int column_non_zero = 0;
// Store sum of rowsums, max of row sum
// number of non zero row sums
for (int i = 0; i < r; i++) {
row_sum += row[i];
row_max = max(row_max, row[i]);
if (row[i])
row_non_zero++;
}
// Store sum of column sums, max of column sum
// number of non zero column sums
for (int i = 0; i < c; i++) {
column_sum += column[i];
column_max = max(column_max, column[i]);
if (column[i])
column_non_zero++;
}
// Check condition 1, 2, 3
if ((row_sum != column_sum) ||
(row_max > column_non_zero) ||
(column_max > row_non_zero))
return false;
return true;
}
// Driver Code
int main()
{
int row[] = { 2, 2, 2, 2, 2 };
int column[] = { 5, 5, 0, 0 };
int r = sizeof(row) / sizeof(row[0]);
int c = sizeof(column) / sizeof(column[0]);
if (matrix_exist(row, column, r, c))
cout << "YES\n";
else
cout << "NO\n";
}
Java
// Java implemenation of above approach
import java.util.*;
class GFG
{
// Function to check if matrix exists
static boolean matrix_exist(int row[], int column[],
int r, int c)
{
int row_sum = 0;
int column_sum = 0;
int row_max = -1;
int column_max = -1;
int row_non_zero = 0;
int column_non_zero = 0;
// Store sum of rowsums, max of row sum
// number of non zero row sums
for (int i = 0; i < r; i++)
{
row_sum += row[i];
row_max = Math.max(row_max, row[i]);
if (row[i] > 0)
{
row_non_zero++;
}
}
// Store sum of column sums, max of column sum
// number of non zero column sums
for (int i = 0; i < c; i++)
{
column_sum += column[i];
column_max = Math.max(column_max, column[i]);
if (column[i] > 0)
{
column_non_zero++;
}
}
// Check condition 1, 2, 3
if ((row_sum != column_sum)
|| (row_max > column_non_zero)
|| (column_max > row_non_zero))
{
return false;
}
return true;
}
// Driver Code
public static void main(String[] args)
{
int row[] = { 2, 2, 2, 2, 2 };
int column[] = { 5, 5, 0, 0 };
int r = row.length;
int c = column.length;
if (matrix_exist(row, column, r, c))
System.out.println("Yes");
else
System.out.println("No");
}
}
// This code has been contributed by 29AjayKumar
Python
# Python3 implementation of the above approach
# Function to check if matrix exists
def matrix_exist(row, column, r, c) :
row_sum = 0
column_sum = 0
row_max = -1
column_max = -1
row_non_zero = 0
column_non_zero = 0
# Store sum of rowsums, max of row sum
# number of non zero row sum
for i in range (0, r):
row_sum += row[i]
row_max = max(row_max, row[i])
if (row[i]) :
row_non_zero = row_non_zero + 1
# Store sum of column sums, max of column sum
# number of non zero column sums
for i in range (0, c) :
column_sum += column[i]
column_max = max(column_max, column[i])
if (column[i]) :
column_non_zero = column_non_zero + 1
# Check condition 1, 2, 3
if ((row_sum != column_sum) or
(row_max > column_non_zero) or
(column_max > row_non_zero)) :
return False
return True
# Driver Code
row = [ 2, 2, 2, 2, 2 ]
column = [ 5, 5, 0, 0 ]
r = len(row)
c = len(column)
if (matrix_exist(row, column, r, c)) :
print("YES")
else :
print("NO")
# This code is contributed by ihritik
C#
// C# implemenation of above approach
using System;
class GFG
{
// Function to check if matrix exists
static bool matrix_exist(int [] row, int []column,
int r, int c)
{
int row_sum = 0;
int column_sum = 0;
int row_max = -1;
int column_max = -1;
int row_non_zero = 0;
int column_non_zero = 0;
// Store sum of rowsums, max of row sum
// number of non zero row sums
for (int i = 0; i < r; i++)
{
row_sum += row[i];
row_max = Math.Max(row_max, row[i]);
if (row[i] > 0)
{
row_non_zero++;
}
}
// Store sum of column sums, max of column sum
// number of non zero column sums
for (int i = 0; i < c; i++)
{
column_sum += column[i];
column_max = Math.Max(column_max, column[i]);
if (column[i] > 0)
{
column_non_zero++;
}
}
// Check condition 1, 2, 3
if ((row_sum != column_sum)
|| (row_max > column_non_zero)
|| (column_max > row_non_zero))
{
return false;
}
return true;
}
// Driver Code
public static void Main()
{
int [] row = new int [] { 2, 2, 2, 2, 2 };
int []column = new int [] { 5, 5, 0, 0 };
int r = row.Length;
int c = column.Length;
if (matrix_exist(row, column, r, c))
Console.WriteLine("YES");
else
Console.WriteLine("NO");
}
}
// This code is contributed by ihritik
输出:
YES
时间复杂度: O(N)