¡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 n
cuadrí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 1
y 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]
para0
o1
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.