leetcode 63. 不一样路径Ⅱ golang实现

题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。web

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。数组

如今考虑网格中有障碍物。那么从左上角到右下角将会有多少条不一样的路径?svg

解法:动态规划

代码

func uniquePathsWithObstacles(obstacleGrid [][]int) int {
    if len(obstacleGrid) == 0 || len(obstacleGrid[0]) == 0 || obstacleGrid[0][0] == 1 {
        return 0
    }
    n := len(obstacleGrid)
    m := len(obstacleGrid[0])
    flag := 0
    // 初始化边
    obstacleGrid[0][0] = 1
    for i := 1; i < m; i++ {
        if flag == 0 && obstacleGrid[0][i] == 0 {
            obstacleGrid[0][i] = 1
        } else {
            obstacleGrid[0][i] = 0
            flag = 1
        }
    }
    flag = 0
    for i := 1; i < n; i++ {
        if flag == 0 && obstacleGrid[i][0] == 0 {
            obstacleGrid[i][0] = 1
        } else {
            obstacleGrid[i][0] = 0
            flag = 1
        }
    }
    for i := 1; i < n; i++ {
        for j := 1; j < m; j++ {
            if obstacleGrid[i][j] == 1 {
                obstacleGrid[i][j] = 0
            } else {
                obstacleGrid[i][j] = obstacleGrid[i-1][j] + obstacleGrid[i][j-1]
            }
        }
    }
    return obstacleGrid[n-1][m-1]
}

思路

这道题有一道前置题目,62.不一样路径,区别在于没有障碍物,直接从(0,0)走到(n,m),有几种走法。先来看没有障碍的状况下,这个题要怎么考虑。ui

  • 核心思想:因为只能往右或往下走,那么第(i,j)个位置,只能从(i-1,j) 和 (i, j-1)走过来,那么走法数量为这两个位置的数量相加。
  • 一个点有多是它右边点路径中的点,也多是它下边点路径中的点,所以若是直接用递归计算,会出现一个点被重复计算。这种状况下,使用动态规划,用一个二维数组记录每一个点的路径数量。
  • 二维数组的(0,m)和(n,0),也就是顶边和左边,必定只有一种状况
  • 在两边肯定的状况下,从(1,1)开始循环,计算每一个点的数量
  • 返回(n-1,m-1)

当路径中存在障碍的时候,相比于上面的思路,只须要增长两点spa

  • 初始化时,若是某一点是障碍,则直接置0,那么它对后续的节点就没有影响
  • 初始化两边时,若是某一点是障碍,则后续的点(包括它本身)所有置0