Dada una array Fila[] de tamaño R donde Fila[i] es la suma de elementos de la i -ésima fila y otra array Columna[] de tamaño C donde Columna[i] es la suma de elementos de la i -ésima columna. La tarea es verificar si es posible construir una array binaria de dimensión R * C que satisfaga las sumas de filas y las sumas de columnas dadas. Una array binaria es una array que se llena solo con 0 y 1.
Suma significa el número de 1 en una fila o columna en particular.
Ejemplos:
Entrada: Fila[] = {2, 2, 2, 2, 2}, Columna[] = {5, 5, 0, 0}
Salida: SÍ
La array es
{1, 1, 0, 0}
{1, 1, 0, 0}
{1, 1, 0, 0}
{1, 1, 0, 0}
{1, 1, 0, 0}
Entrada: Fila[] = {0, 0, 3} Columna[] = {3 , 0, 0}
Salida: NO
Acercarse:
- La idea clave es que cualquier celda de la array contribuirá por igual a la suma de las filas y las columnas, por lo que la suma de todas las sumas de las filas debe ser igual a la suma de las columnas.
- Ahora, encuentre el máximo de sumas de filas, si este valor es mayor que el número de sumas de columnas distintas de cero, entonces la array no existe.
- Si el máximo de sumas de columnas es mayor que el número de sumas de filas distintas de cero, entonces no es posible construir una array.
- Si se cumplen las 3 condiciones anteriores, entonces existe la array.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ implementation of the above approach #include <bits/stdc++.h> 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 implementation 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
Python3
# Python 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 sums for i in range(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(c): column_sum = 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 if __name__ == '__main__': 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 nirajgusain5
C#
// C# implementation of above approach using System; public 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 static public void Main () { 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)) Console.Write("YES"); else Console.Write("NO"); } } // This code has been contributed by shubhamsingh10
Javascript
<script> // Javascript implementation of the above approach // Function to check if matrix exists function matrix_exist(row, column, r, c) { var row_sum = 0; var column_sum = 0; var row_max = -1; var column_max = -1; var row_non_zero = 0; var column_non_zero = 0; // Store sum of rowsums, max of row sum // number of non zero row sums for (var i = 0; i < r; i++) { row_sum += row[i]; row_max = Math.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 (var i = 0; i < c; i++) { column_sum += column[i]; column_max = Math.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 var row = [2, 2, 2, 2, 2]; var column = [5, 5, 0, 0]; var r = row.length; var c = column.length; if (matrix_exist(row, column, r, c)) document.write( "YES"); else document.write( "NO"); </script>
YES
Complejidad de tiempo : O(N)