Suma del área de matriz de la programación dinámica de LeetCode

¡Acostúmbrate a escribir juntos! Este es el cuarto día de mi participación en el "Nuevo plan diario de los Nuggets·Desafío de actualización de abril", haz clic para ver los detalles del evento .

tema

área de la matriz y

Dada una  m x n matriz  mat y un entero k, devuelva una matriz  answer donde cada uno  answer[i][j] sea la suma de todos los elementos que satisfagan las siguientes condiciones  mat[r][c]

i - k <= r <= i + ky en la
j - k <= c <= j + kmatriz
(r, c) .  

Ejemplo 1:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[12,21,16],[27,45,33],[24,39,28]]
复制代码

Ejemplo 2:

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
输出:[[45,45,45],[45,45,45],[45,45,45]]
复制代码

insinuación:

m == mat.length
n == mat[i].length
1 <= m, n, k <= 100
1 <= mat[i][j] <= 100
复制代码

responder

análisis de resolución de problemas

Ideas para resolver problemas

  1. Este problema es un problema típico de programación dinámica;
  2. dp[i][j] representa la longitud máxima del lado cuadrado que puede formar la esquina inferior derecha de la i-ésima fila y la j-ésima columna, entonces la fórmula de recurrencia es:
dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]);
复制代码

Luego max * maxobtenga el valor máximo del área rectangular por .
3. El código de resolución de problemas es el siguiente:
Complejidad
Tiempo Complejidad: O(M * N)
Espacio Complejidad:O(M * N)

código de resolución de problemas

El código de la solución es el siguiente (comentarios detallados en el código):

class Solution {
    public int maximalSquare(char[][] matrix) {
        /**
        dp[i][j]表示以第i行第j列为右下角所能构成的最大正方形边长, 则递推式为: 
        dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]);
        **/
        int m = matrix.length;
        if(m < 1) return 0;
        int n = matrix[0].length;
        int max = 0;
        int[][] dp = new int[m+1][n+1];
        
        for(int i = 1; i <= m; ++i) {
            for(int j = 1; j <= n; ++j) {
                if(matrix[i-1][j-1] == '1') {
                    dp[i][j] = 1 + Math.min(dp[i-1][j-1], Math.min(dp[i-1][j], dp[i][j-1]));
                    max = Math.max(max, dp[i][j]); 
                }
            }
        }
        
        return max*max;
    }
}
复制代码

Resultados de comentarios después del envío (debido a que este tema no ha sido optimizado, el rendimiento es promedio):

imagen.png

Informacion de referencia

Supongo que te gusta

Origin juejin.im/post/7083104853047640094
Recomendado
Clasificación