Recuento de celdas vacías en una array cuadrada dada después de actualizar las filas y columnas para consultas Q

Dada una array binaria de tamaño NxN que inicialmente se llena con 0 y consultas Q tales que:

  • Cada consulta es de tipo (r, c) donde r y c denotan el número de fila y el número de columna respectivamente.
  • Cambie todos los 0 de la fila r y la columna c a 1.

La tarea es encontrar el conteo de 0 después de realizar cada consulta en la array dada.

 Ejemplos:

Entrada: N = 3, Q = 3, consultas = {{2, 2}, {2, 3}, {3, 2}}
Salida: 4 2 1
Explicación: Después de la 1.ª operación, toda la 2.ª fila y toda la 2.ª la columna se llenará con 1. Por lo tanto, la celda restante con valor 0 será 4.
Después de la 2.ª operación, toda la 2.ª fila y toda la 3.ª columna se rellenarán con 1. Por lo tanto, la celda restante con valor 0 será 2. 
Después de la 3.ª operación, las celdas teniendo valor 0 será 1. 

Entrada: N = 4, Q = 3, consultas = {{3, 1}, {3, 3}, {4, 2}}
Salida: 9 6 3 
Explicación: Después de la primera operación, toda la tercera fila y toda la primera la columna se llenará con 1. Por lo tanto, la celda restante con valor 0 será 9.
Después de la 2.ª operación, toda la 3.ª fila y toda la 3.ª columna se rellenarán con 1. Por lo tanto, la celda restante con valor 0 será 6.
Después de la 3.ª Las celdas de operación que tengan valor 0 serán 3.

 

Enfoque ingenuo: el enfoque básico para resolver este problema es actualizar los elementos de la array para los elementos de la fila y la columna mencionados para una consulta y luego recorrer toda la array para encontrar el recuento de ceros restantes. Este proceso se repetirá para todas las consultas Q.

Complejidad de Tiempo: O(Q*(N+N 2 )) = O(Q*(N 2 ))
Espacio Auxiliar: O(1)

Enfoque eficiente: el enfoque anterior se puede optimizar eliminando la necesidad de atravesar la array para consultas Q con la ayuda de hashing .

  • Cree una array hash para almacenar la fila y la columna escaneadas.
  • Declare las variables r y c para almacenar el recuento de 0 presente en la fila y la columna y declare ans y almacene NxN .
  • Ahora comience a recorrer la array dada , y en cada iteración:
    • Compruebe si la fila y la columna actuales ya existen o no en la array hash.
    • Si la fila actual no está presente, reste r de ans y disminuya el valor de c en 1.
    • Si la columna actual no está presente, reste la c dada de ans y disminuya el valor de r en 1.
    • Empuje y en vector.

Ilustración: 

Considere la array:

N=3

0 0 0

0 0 0

0 0 0

Inicialmente ans=n*n=9, r=3(Número de ceros en la fila) y c=3(Número de ceros en la columna)

Recorrer cada consulta dada

por ejemplo, consultas = {{2, 2}, {2, 3}, {3, 2}}

Seleccione la primera fila de consulta = 2 y la columna = 2, verifique si esta fila o columna ya se convirtió en una o no usando hashmap.

Aquí fila=2 no se visita, así que convierta todos los ceros presentes en esa fila en uno, es decir, ans-=r, debido a que este número de ceros en cada columna se reduce en 1, es decir, c–.

0 0 0

1 1 1

0 0 0

Ahora ans=9-3=6, r=3(Número de ceros en la fila) y c=2(Número de ceros en la columna)

Aquí col=2 no se visita en la primera consulta, así que convierta todos los ceros presentes en esa columna en uno, es decir, ans-=c, debido a que este número de ceros en cada fila se reduce en 1, es decir, r–.

0 1 0

1 1 1

0 1 0

Ahora ans=6-2=4, r=2(Número de ceros en la fila) y c=2(Número de ceros en la columna)

Entonces, después de la ejecución de la primera consulta, el número de ceros restantes es 4.

Seleccione la segunda fila de consulta = 2 y la columna = 3, verifique si esta fila o columna ya se convirtió en una o no usando hashmap.

Aquí la fila = 2 ya se visitó, así que simplemente continúe.

Aquí col=3 no se visita en la primera consulta, así que convierta todos los ceros presentes en esa columna en uno, es decir, ans-=c, debido a que este número de ceros en cada fila se reduce en 1, es decir, r–.

0 1 1

1 1 1

0 1 1

Ahora ans=4-2=2, r=1(Número de ceros en la fila) y c=2(Número de ceros en la columna)

Entonces, después de la ejecución de la segunda consulta, el número de ceros restantes es 2.

Repita el proceso para todas las consultas.

A continuación se muestra la implementación del enfoque anterior.

C++

// C++ code to implement the above approach.
#include <bits/stdc++.h>
using namespace std;
 
vector<long long int> countZero(
    int n, int k,
    vector<vector<int> >& arr)
{
    long long int ans = n, r = n, c = n;
    // for declaring n*n matrix
    ans *= ans;
    vector<bool> row(n + 1, true), col(n + 1, true);
    vector<long long int> v;
    for (int i = 0; i < k; i++) {
 
        // If current row is not present,
        // subtract r from ans
        if (row[arr[i][0]]) {
            ans -= r;
            c--;
            row[arr[i][0]] = false;
        }
 
        // If current column is not present,
        // subtract c from ans and
        // decrement value of r by 1.
        if (col[arr[i][1]]) {
            ans -= c;
            r--;
            col[arr[i][1]] = false;
        }
        v.push_back(ans);
    }
    return v;
}
 
// Driver code
int main()
{
    int N = 3, Q = 3;
    vector<vector<int> > arr
        = { { 2, 2 }, { 2, 3 }, { 3, 2 } };
    vector<long long int> ans = countZero(N, Q, arr);
 
    for (int i = 0; i < ans.size(); i++) {
        cout << ans[i] << " ";
    }
    cout << endl;
 
    return 0;
}

Java

// Java code to implement the above approach.
import java.util.*;
class GFG{
 
  static Vector<Integer> countZero(
    int n, int k,
    int [][]  arr)
  {
    int ans = n, r = n, c = n;
 
    // for declaring n*n matrix
    ans *= ans;
    boolean []row = new boolean[n+1];
    Arrays.fill(row, true);
    boolean []col = new boolean[n+1];
    Arrays.fill(col, true);
    Vector<Integer> v = new Vector<Integer>();
    for (int i = 0; i < k; i++) {
 
      // If current row is not present,
      // subtract r from ans
      if (row[arr[i][0]]) {
        ans -= r;
        c--;
        row[arr[i][0]] = false;
      }
 
      // If current column is not present,
      // subtract c from ans and
      // decrement value of r by 1.
      if (col[arr[i][1]]) {
        ans -= c;
        r--;
        col[arr[i][1]] = false;
      }
      v.add(ans);
    }
    return v;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int N = 3, Q = 3;
    int [][] arr
      = { { 2, 2 }, { 2, 3 }, { 3, 2 } };
    Vector<Integer> ans = countZero(N, Q, arr);
 
    for (int i = 0; i < ans.size(); i++) {
      System.out.print(ans.get(i)+ " ");
    }
    System.out.println();
 
  }
}
 
// This code is contributed by 29AjayKumar

Python3

# Python program for the above approach
def countZero(n, k, arr) :
     
    ans = n
    r = n
    c = n
     
    # for declaring n*n matrix
    ans *= ans
    row = [True] * (n + 1)
    col = [True] * (n + 1)
    v= [[]]
    for i in range(k):
 
        # If current row is not present,
        # subtract r from ans
        if (row[arr[i][0]]) :
            ans -= r
            c -= 1
            row[arr[i][0]] = False
         
 
        # If current column is not present,
        # subtract c from ans and
        # decrement value of r by 1.
        if (col[arr[i][1]]) :
            ans -= c
            r -= 1
            col[arr[i][1]] = False
         
        v.append(ans)
     
    return v
 
# Driver code
N = 3
Q = 3
arr = [[ 2, 2 ], [ 2, 3 ], [ 3, 2 ]]
ans = countZero(N, Q, arr)
 
for i in range(1, len(ans)):
   print(ans[i], end = " ")
     
# This code is contributed by code_hunt.

C#

// C# code to implement the above approach.
using System;
using System.Collections;
 
class GFG {
 
  static ArrayList countZero(int n, int k, int[, ] arr)
  {
    int ans = n, r = n, c = n;
 
    // for declaring n*n matrix
    ans *= ans;
    ArrayList row = new ArrayList(n + 1);
    ArrayList col = new ArrayList(n + 1);
 
    for (int i = 0; i < n + 1; i++) {
      row.Add(1);
      col.Add(1);
    }
 
    ArrayList v = new ArrayList();
    for (int i = 0; i < k; i++) {
 
      // If current row is not present,
      // subtract r from ans
      if ((int)row[arr[i, 0]] == 1) {
        ans -= r;
        c--;
        row[arr[i, 0]] = 0;
      }
 
      // If current column is not present,
      // subtract c from ans and
      // decrement value of r by 1.
      if ((int)col[arr[i, 1]] == 1) {
        ans -= c;
        r--;
        col[arr[i, 1]] = 0;
      }
      v.Add(ans);
    }
    return v;
  }
 
  // Driver code
  public static void Main()
  {
    int N = 3, Q = 3;
    int[, ] arr = { { 2, 2 }, { 2, 3 }, { 3, 2 } };
 
    ArrayList ans = countZero(N, Q, arr);
 
    for (int i = 0; i < ans.Count; i++) {
      Console.Write(ans[i] + " ");
    }
    Console.WriteLine();
  }
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript

<script>
       // JavaScript code for the above approach
       function countZero(n, k, arr)
       {
           let ans = n, r = n, c = n;
         
            // for declaring n*n matrix
           ans *= ans;
           let row = new Array(n + 1).fill(true), col = new Array(n + 1).fill(true);
           let v = [];
           for (let i = 0; i < k; i++) {
 
               // If current row is not present,
               // subtract r from ans
               if (row[arr[i][0]]) {
                   ans -= r;
                   c--;
                   row[arr[i][0]] = false;
               }
 
               // If current column is not present,
               // subtract c from ans and
               // decrement value of r by 1.
               if (col[arr[i][1]]) {
                   ans -= c;
                   r--;
                   col[arr[i][1]] = false;
               }
               v.push(ans);
           }
           return v;
       }
 
       // Driver code
       let N = 3, Q = 3;
       let
           arr = [[2, 2], [2, 3], [3, 2]];
       let ans = countZero(N, Q, arr);
 
       for (let i = 0; i < ans.length; i++) {
           document.write(ans[i] + ' ');
       }
       document.write('<br>')
 
      // This code is contributed by Potta Lokesh
   </script>
Producción: 

4 2 1

 

Complejidad de tiempo: O(K)
Complejidad de espacio: O(N)

Publicación traducida automáticamente

Artículo escrito por vikramramwani2 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 *