LeetCode - #63 Caminos diferentes II

¡Acostúmbrate a escribir juntos! Este es el noveno día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

prefacio

Nuestra comunidad organizará sucesivamente las soluciones de problemas del algoritmo Swift de Gu Yi ( hacker de crecimiento de Netflix, autor de "The Way of the iOS Interview", entrenador de fitness profesional de ACE ) en una versión de texto para que todos puedan aprender y leer.

Hemos actualizado el algoritmo LeetCode para 62 problemas hasta el momento, y mantendremos el tiempo y el progreso de la actualización ( publicado a las 9:00 a. m. los lunes, miércoles y viernes ). Habrá una gran mejora.

Si no acumulas un pequeño paso, no puedes recorrer mil millas, si no acumulas un pequeño arroyo, no puedes hacer un río, la comunidad Swift te acompaña para seguir adelante. Si tiene sugerencias y comentarios, deje un mensaje al final del artículo, haremos todo lo posible para satisfacer sus necesidades.

Nivel de dificultad: medio

1. Descripción

Un robot está ubicado en la esquina superior izquierda de una m x ncuadrícula (el punto de inicio está marcado como "Inicio" en la imagen a continuación).

El robot solo puede moverse hacia abajo o hacia la derecha un paso a la vez. El robot intenta llegar a la esquina inferior derecha de la cuadrícula (etiquetada como "Finalizar" en la imagen de abajo).

Ahora considere que hay obstáculos en la malla. Entonces, ¿cuántos caminos diferentes habrá desde la esquina superior izquierda hasta la esquina inferior derecha?

Los obstáculos y las posiciones vacías en la cuadrícula se indican con 1y 0.

2. Ejemplo

Ejemplo 1

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2 条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
复制代码

Ejemplo 2

输入:obstacleGrid = [[0,1],[0,0]]
输出:1
复制代码

Restricciones:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j]para 0o1

3. Respuestas

class UniquePathsII {
    func uniquePathsWithObstacles(_ obstacleGrid: [[Int]]) -> Int {
        let m = obstacleGrid.count
        guard m > 0 else {
            return 0
        }
        
        let n = obstacleGrid[0].count
        guard n > 0 else {
            return 0
        }
    
        var dp = Array(repeating: Array(repeating: -1, count: n), count: m)
        
        return help(m - 1, n - 1, &dp, obstacleGrid)
    }
    
    fileprivate func help(_ m: Int, _ n: Int, _ dp: inout [[Int]], _ obstacleGrid: [[Int]]) -> Int {
        if m < 0 || n < 0 {
            return 0
        }
        if obstacleGrid[m][n] == 1 {
            return 0
        }
        if m == 0 && n == 0 {
            return 1
        }
        if dp[m][n] != -1 {
            return dp[m][n]
        }
        
        dp[m][n] = help(m - 1, n, &dp, obstacleGrid) + help(m, n - 1, &dp, obstacleGrid)
        return dp[m][n]
    }
}
复制代码
  • Idea principal: programación dinámica 2D, que utiliza matrices 2D como cachés para almacenar datos computacionales.
  • Complejidad de tiempo: O(mn)
  • Complejidad espacial: O(mn)

Repositorio para la solución del algoritmo: LeetCode-Swift

Haga clic para ir a la práctica de LeetCode

sobre nosotros

Somos mantenidos conjuntamente por entusiastas de Swift. Compartiremos el contenido técnico centrado en Swift combat, SwiftUI y Swift Foundation, y también organizaremos y recopilaremos excelentes materiales de aprendizaje.

En el futuro, se traducirá mucha información a nuestra cuenta oficial. Si está interesado, puede unirse a nosotros.

Supongo que te gusta

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