Maximice el recuento de filas que constan de elementos iguales al voltear las columnas de una Array

Dada una array binaria , mat[][] de dimensiones N * M , la tarea es maximizar el recuento de filas que consisten solo en elementos iguales seleccionando cualquier columna de la array y volteando todos los elementos de esa columna en cada operación. Imprime el número máximo de filas que se pueden hacer para formar elementos iguales.

Ejemplos:

Entrada: mat[][] = { { 0, 1, 0, 0, 1 }, { 1, 1, 0, 1, 1 }, { 1, 0, 1, 1, 0 } } 
Salida:
Explicación: 
Seleccione la segunda columna y voltee todos los elementos de esa columna para modificar mat[][] a { { 0, 0, 0, 0, 1 }, { 1, 0, 0, 1, 1 }, { 1, 1 , 1, 1, 0 } } 
Seleccione la quinta columna y voltee todos los elementos de esa columna para modificar mat[][] a { { 0, 0, 0, 0, 0 }, { 1, 0, 0, 1 , 0 }, { 1, 1, 1, 1, 1 } } 
Dado que todos los elementos de la 1 ra fila y la 3 ra fila de la array son iguales y también es el número máximo de filas que se pueden hacer para contener elementos iguales solo, la salida requerida es 2.
Entrada: mat[][] = { {0, 0}, {0, 1} } 
Salida:
 

Enfoque ingenuo: el enfoque más simple para resolver este problema es contar el número de filas que contienen elementos iguales únicamente, para todas las formas posibles de seleccionar una combinación de columnas y voltear sus elementos. Finalmente, imprima el conteo máximo obtenido para cualquiera de las combinaciones anteriores. 
Complejidad de Tiempo: O(N * M * 2 M )  
Espacio Auxiliar: O(N * M)

Enfoque eficiente: para optimizar el enfoque anterior, la idea se basa en el hecho de que, si una fila es el complemento de 1 de la otra fila o ambas filas son iguales, entonces solo ambas filas contendrán elementos iguales solo realizando el operaciones dadas.

Ilustración:
Consideremos la siguiente array:
 

1 0 1 0 1 1 0 0
0 1 0 1 0 0 1 1
0 1 1 1 0 0 0 0
0 1 0 1 0 0 1 1
1 0 1 0 1 1 0 0

En la array anterior, las filas 1 y 2 son complemento a 1 entre sí, y las filas 5 y 4 son complemento a 1 entre sí. 
 

Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos cntMaxRows , para almacenar la cantidad máxima de filas que constan solo de elementos iguales.
  • Inicialice un Map , digamos mp , para almacenar todas las filas posibles de la array.
  • Recorra cada fila de la array y guárdela en el Mapa .
  • Recorra cada fila de la array usando la variable fila . Calcule el complemento de fila de 1 y actualice cntMaxRows = max(cntMaxRows, mp[row] + mp[1’s_comp_row]) 
     
  • Finalmente, imprima el valor de cntMaxRows .

A continuación se muestra la implementación de nuestro enfoque:

C++

// C++ program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the maximum number
// of rows containing all equal elements
int maxEqrows(vector<vector<int> >& mat,
              int N, int M)
{
 
    // Store each row of the matrix
    map<vector<int>, int> mp;
 
    // Traverse each row of the matrix
    for (int i = 0; i < N; i++) {
 
        // Update frequency of
        // current row
        mp[mat[i]]++;
    }
 
    // Stores maximum count of rows
    // containing all equal elements
    int cntMaxRows = 0;
 
    // Traverse each row of the matrix
    for (int i = 0; i < N; i++) {
 
        // Stores 1's complement
        // of the current row
        vector<int> onesCompRow(M, 0);
 
        // Traverse current row
        // of the given matrix
        for (int j = 0; j < M; j++) {
 
            // Stores 1s complement of
            // mat[i][j]
            onesCompRow[j]
                = (mat[i][j] ^ 1);
        }
 
        // Update cntMaxRows
        cntMaxRows = max(cntMaxRows,
                         mp[mat[i]] + mp[onesCompRow]);
    }
 
    return cntMaxRows;
}
 
// Driver Code
int main()
{
    vector<vector<int> > mat
        = { { 0, 1, 0, 0, 1 },
            { 1, 1, 0, 1, 1 },
            { 1, 0, 1, 1, 0 } };
 
    // Stores count of rows
    int N = mat.size();
 
    // Stores count of columns
    int M = mat[0].size();
 
    cout << maxEqrows(mat, N, M);
}

Java

// Java program to implement
import java.util.*;
class GFG
{
  // Function to find the maximum number
  // of rows containing all equal elements
  static int maxEqrows(Vector<Vector<Integer>> mat,
                       int N, int M)
  {
 
    // Store each row of the matrix
    HashMap<Vector<Integer>, Integer> mp = new HashMap<>();
 
    // Traverse each row of the matrix
    for (int i = 0; i < N; i++)
    {
 
      // Update frequency of
      // current row
      if(mp.containsKey(mat.get(i)))
      {
        mp.put(mat.get(i), mp.get(mat.get(i)) + 1);
      }
      else
      {
        mp.put(mat.get(i), 1);
      }
    }
 
    // Stores maximum count of rows
    // containing all equal elements
    int cntMaxRows = 0;
 
    // Traverse each row of the matrix
    for (int i = 0; i < N; i++)
    {
 
      // Stores 1's complement
      // of the current row
      Vector<Integer> onesCompRow = new Vector<Integer>();
      for(int j = 0; j < M; j++)
      {
        onesCompRow.add(0);
      }
 
      // Traverse current row
      // of the given matrix
      for (int j = 0; j < M; j++)
      {
 
        // Stores 1s complement of
        // mat[i][j]
        onesCompRow.set(j, mat.get(i).get(j) ^ 1);
      }
 
      // Update cntMaxRows
      if(!mp.containsKey(mat.get(i)))
      {
        cntMaxRows = Math.max(cntMaxRows, mp.get(onesCompRow));
      }
      else if(!mp.containsKey(onesCompRow))
      {
        cntMaxRows = Math.max(cntMaxRows, mp.get(mat.get(i)));
      }
      else
      {
        cntMaxRows = Math.max(cntMaxRows, mp.get(mat.get(i)) +
                              mp.get(onesCompRow));
      }
    }
    return cntMaxRows;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    Vector<Vector<Integer>> mat = new Vector<Vector<Integer>>();
    mat.add(new Vector<Integer>());
    mat.add(new Vector<Integer>());
    mat.add(new Vector<Integer>());
    mat.get(0).add(0);
    mat.get(0).add(1);
    mat.get(0).add(0);
    mat.get(0).add(0);
    mat.get(0).add(1);       
    mat.get(1).add(1);
    mat.get(1).add(1);
    mat.get(1).add(0);
    mat.get(1).add(1);
    mat.get(1).add(1);
    mat.get(2).add(1);
    mat.get(2).add(0);
    mat.get(2).add(1);
    mat.get(2).add(1);
    mat.get(2).add(0);
 
    // Stores count of rows
    int N = mat.size();
 
    // Stores count of columns
    int M = mat.get(0).size();    
    System.out.println(maxEqrows(mat, N, M));
  }
}
 
// This code is contributed by divyesh072019

C#

// C# program to implement
// the above approach
using System;
using System.Collections.Generic; 
class GFG {
 
  // Function to find the maximum number
  // of rows containing all equal elements
  static int maxEqrows(List<List<int>> mat, int N, int M)
  {
 
    // Store each row of the matrix
    Dictionary<List<int>, int> mp = new Dictionary<List<int>, int>();
 
    // Traverse each row of the matrix
    for (int i = 0; i < N; i++) {
 
      // Update frequency of
      // current row
      if(mp.ContainsKey(mat[i]))
      {
        mp[mat[i]]++;
      }
      else{
        mp[mat[i]] = 1;
      }
    }
 
    // Stores maximum count of rows
    // containing all equal elements
    int cntMaxRows = 0;
 
    // Traverse each row of the matrix
    for (int i = 0; i < N; i++) {
 
      // Stores 1's complement
      // of the current row
      List<int> onesCompRow = new List<int>();
      for(int j = 0; j < M; j++)
      {
        onesCompRow.Add(0);
      }
 
      // Traverse current row
      // of the given matrix
      for (int j = 0; j < M; j++) {
 
        // Stores 1s complement of
        // mat[i][j]
        onesCompRow[j] = (mat[i][j] ^ 1);
      }
 
      // Update cntMaxRows
      if(!mp.ContainsKey(mat[i]))
      {
        cntMaxRows = Math.Max(cntMaxRows, mp[onesCompRow] + 1);
      }
      else if(!mp.ContainsKey(onesCompRow))
      {
        cntMaxRows = Math.Max(cntMaxRows, mp[mat[i]] + 1);
      }
      else{
        cntMaxRows = Math.Max(cntMaxRows, mp[mat[i]] + mp[onesCompRow] + 1);
      }
    }
 
    return cntMaxRows;
  }
 
  // Driver code
  static void Main() {
    List<List<int>> mat = new List<List<int>>();
    mat.Add(new List<int> { 0, 1, 0, 0, 1 });
    mat.Add(new List<int> { 1, 1, 0, 1, 1 });
    mat.Add(new List<int> { 1, 0, 1, 1, 0 });
 
    // Stores count of rows
    int N = mat.Count;
 
    // Stores count of columns
    int M = mat[0].Count;
 
    Console.WriteLine(maxEqrows(mat, N, M));
  }
}
 
// This code is contributed by divyeshrabadiya07
Producción: 

2

 

Complejidad temporal: O(N * M)  
Espacio auxiliar: O(M)

Publicación traducida automáticamente

Artículo escrito por lostsoul27 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *