📌  相关文章
📜  查找是否存在具有给定行和列总和的二进制矩阵

📅  最后修改于: 2021-04-22 03:25:59             🧑  作者: Mango

给定大小R的阵列行[]其中行[i]第i行的元素与尺寸为C的另一阵列列[]的总和,其中柱[i]第i列的元素的总和。任务是检查是否有可能构造一个R * C维的二进制矩阵,该矩阵满足给定的行总和和列总和。二进制矩阵是仅填充0和1的矩阵。
总和是指特定行或列中1的数目。

例子:

方法:

  1. 关键思想是矩阵中的任何单元格将对行和列之和做出同等贡献,因此所有行之和必须等于列之和。
  2. 现在,如果此值大于非零列总和的数量且不存在矩阵,则查找行总和的最大值。
  3. 如果列总和的最大值大于非零行总和的数目,则无法构造矩阵。
  4. 如果满足以上所有三个条件,则存在矩阵。

下面是上述方法的实现:

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)