Dada una matriz con 1s y 0s, necesitamos crear una matriz tal que a [i] [j] = 1, si solo cada elemento en la fila i y columna j es 1, de lo contrario 0. Tenemos que usar un espacio constante y tener Una óptima complejidad temporal. ¿Cuáles son algunas posibles soluciones?

Aquí hay una solución asumiendo que puede editar la matriz original. Deje que mat (i, j) sea la matriz original de tamaño MxN. Transformaremos esto en una matriz de suma de manera que mat (i, j) contenga la suma de todos los elementos en el rectángulo de (0,0) a (i, j). El siguiente fragmento de código hará eso:

  para (int i = 0; i <M; i ++) {
         para (int j = 0; j  = 0)? mat [i-1] [j]: 0;
             mat [i] [j] + = ((j-1)> = 0)? mat [i] [j-1]: 0;
             mat [i] [j] - = ((i-1)> = 0 && (j-1)> = 0)? mat [i-1] [j-1]: 0;
         }
     }

Ahora podemos calcular la suma de la i-ésima fila y la jésima columna en la matriz original restando la suma de 4 cuadrantes (sombreados en blanco en la figura) de la suma total de la matriz.

Suma del cuadrante superior izquierdo = mat (i-1, j-1)
Suma del cuadrante superior derecho = mat (i-1, N-1) – mat (i-1, j)
Suma del cuadrante inferior izquierdo = mat (M-1, j-1) – mat (i, j-1)
Suma del cuadrante más a la derecha = mat (M-1, N-1) – mat (i, N-1) – m (M-1, j) – mat (i, j)

Deje que la matriz final sea trans (i, j). Establezca todos los elementos de esta matriz en 0.
Si la suma de la i-ésima fila y la columna j es M + N + 1, entonces trans (i, j) = 1 más 0. Aquí hay un código para hacer eso:

  para (int i = 0; i <M; i ++) {
         para (int j = 0; j  = 1) {
                 suma + = mat [i-1] [N-1] - mat [i-1] [j];
             }
             si (j> = 1) {
                 suma + = mat [M-1] [j-1] - mat [i] [j-1];
             }
             if ((i-1)> = 0 && (j-1)> = 0) {
                 suma + = mat [i-1] [j-1];
             }

             if (mat [M-1] [N-1] - sum == (M + N + 1)) {
                 final [i] [j] = 1;
             }
         }
     }

Esto es O (n ^ 2) ya que solo revisamos la matriz completa dos veces y es un espacio constante.

Este problema se puede resolver en O (N ^ 2) y espacio extra “constante” si se nos permite reutilizar el espacio en la matriz de la solución.

En primer lugar, verifique si la matriz original tiene al menos un elemento 0. Si no, la matriz de solución consistirá en todos los 1s y ya está. Entonces, dejemos que (i, j) sea un elemento 0. Esto significa que la fila i y la columna j de la matriz de salida deben llenarse con ceros eventualmente. Por lo tanto, podemos usar temporalmente esa fila y columna como nuestro bloc de notas.

Rellene la fila i y la columna j de la matriz de salida con 1s. Ir a través de todos los elementos en la matriz original. Para cada elemento 0 (k, l), establezca los elementos (i, l) y (k, j) de la matriz de salida en 0 para significar que la fila k y la columna l de la matriz de salida eventualmente deben ponerse a cero.

Una vez finalizado este proceso, podemos llenar la matriz de salida fácilmente. Para cada (k, l) en la matriz de salida, excepto para aquellos con k = i y / o l = j, configúrelo en 1 si ambos elementos (i, l) y (k, j) son 1 y 0 en caso contrario . Después de esto, establezca todos los elementos en la fila i y en la columna j en 0.

Es fácil ver que este algoritmo solo requiere tiempo O (N ^ 2) y espacio extra constante (para contadores de bucles y para almacenar la identidad de i y j).

Una posible solución que tiene una complejidad temporal O (n ^ 2) y una complejidad espacial constante es la siguiente:

  // Programa para crear otra matriz a partir de una matriz dada basada en algunos criterios

 #include 

 #define ROWS 3
 #define COLUMNS 3

 int main ()
 {
	 int nMat [FILAS] [COLUMNAS] = {
		 {1, 1, 1},
		 {0, 1, 0},
		 {0, 1, 1}
	 };

	 int nResMat [FILAS] [COLUMNAS];

	 para (int i = COLUMNAS - 1; i> 0; i--)
	 {
		 nResMat [0] [i] = 0;
		 para (int j = 0; j  = 0; i--)
	 {
		 para (int j = COLUMNAS - 1; j> 0; j--)
		 {
			 nResMat [i] [j] = nResMat [i] [0] * nResMat [0] [j];
		 }
	 }

	 int nSumRow = nResMat [0] [0];

	 nResMat [0] [0] = nSumCol;

	 para (int i = FILAS - 1; i> 0; i--)
	 {
		 nResMat [i] [0] = nResMat [i] [0] * nResMat [0] [0];
	 }

	 nResMat [0] [0] = nSumRow * nSumCol;
	 std :: cout << "Nueva matriz formada \ n";
	 para (int i = 0; i 

simplemente escribiendo lo primero que me viene a la mente

  int entrada [M] [N], salida [M] [N];
 int i, j, k;

 para (i = 0; i 
    

Aquí está mi respuesta, si a [] [] es la matriz de entrada y c [] [] es la salida:

1.Haga c [i] [0] = c [0] [j] = 1 para todos i y j.
2. Ahora, pase por cada fila, un [i] [0 … m-1]. Si a [i] [j] == 0, establezca c [i] [0] = 0. Haz lo mismo para cada columna.
3.Para todo i, j: c [i] [j] = c [i] [0] && c [0] [j]. Solo la primera fila y columna deben completarse ahora.

Llenar la primera fila de c, en tiempo lineal.
1.Configurar c [0] [0] = 1.
2.Compruebe a [0] [0 … m-1]. Si a [0] [j] = 0, establezca c [0] [0] = 0.
3. Configure c [0] [j] = c [0] [j] && c [0] [0].

Haz lo mismo para la primera columna.