LeetCode-不同路径 II

106 阅读1分钟

算法记录

LeetCode 题目:

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


说明

一、题目

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

  现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

  网格中的障碍物和空位置分别用 1 和 0 来表示。

二、分析

  • 机器人只能往右或者下方移动,也就意味着当前点的来处只能是上一个位置或者是左一个位置,状态转移方程就可以定义出来了。
  • 边界条件是第一行和第一列,这两处位置只能单方向的前进,也就是一旦有一个位置被障碍物堵了后面的位置都不可到达,这是一个初始化需要进行的。
  • 因为原数据上存在着障碍物的代码为正数,为了确保最终移动的正确,就不能在原位上进行操作,只能新建一个状态数组。
  • 遍历这个路径数组,预到障碍物直接跳过即可,因为当前点的路径肯定为零,就不用检测了。
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int[][] stat = new int[obstacleGrid.length][obstacleGrid[0].length];
        if(obstacleGrid[0][0] != 1) stat[0][0] = 1;
        for(int i = 1; i < obstacleGrid.length; i++) {
            if(obstacleGrid[i][0] != 1 && stat[i - 1][0] != 0) stat[i][0] = 1;
        }
        for(int i = 1; i < obstacleGrid[0].length; i++) {
            if(obstacleGrid[0][i] != 1 && stat[0][i - 1] != 0) stat[0][i] = 1;
        }
        for(int i = 1; i < obstacleGrid.length; i++) {
            for(int j = 1; j < obstacleGrid[0].length; j++) {
                if(obstacleGrid[i][j] == 1) continue;
                if(stat[i - 1][j] != 0 || stat[i][j - 1] != 0) {
                    stat[i][j] = stat[i - 1][j] + stat[i][j - 1];
                }
            }
        }
        return stat[stat.length - 1][stat[0].length - 1];
    }
}

总结

数字动态规划应用场景和状态转移方程的定义。