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.
- ¿Cómo es coherente una búsqueda iterativa de profundización en beneficio de BFS y DFS?
- ¿De qué manera aprender sobre algoritmos mejora sus habilidades de programación?
- Si solo pudieras usar un algoritmo de Machine Learning para el resto de tu vida, ¿cuál sería?
- Con los algoritmos de cifrado modernos, ¿es factible que alguien sepa qué algoritmo se utilizó al mirar el texto cifrado?
- ¿Qué algoritmos se usan para calcular logaritmos?
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.