秋招 - 算法 - 不同路径

70 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情 >>

一、题目描述 LeetCode - 62

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:

image.png

输入:m = 3, n = 7
输出:28

示例 2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

示例 3:

输入:m = 7, n = 3
输出:28

示例 4:

输入:m = 3, n = 3
输出:6

二、解题思路

本题要求求出从矩阵左上角,走到右下角的所有可行路径,并且每次只能向右或向下走一格。我们可以使用动态规划来解决,创建一个二维数组dp记录中间状态,其中dp[i][j]表示走到矩阵matrix[i][j]可以有多少种走法。我们可以分三种情况来完成dp数组的构造:

  • 对于dp数组第一行既dp[0][j],由于矩阵matrix第一行的格子只有一种方法抵达,所以只有一种走法,向右走。
  • 对于dp数组第一列既dp[i][0],由于矩阵matrix第一列的格子也只有一种方法抵达,所以也只会有一种走法,向下走。
  • 对于matrix中的其他格子,比如matrix[i][j],其可以由matrix[i-1][j]和matrix[i][j-1]抵达,所以dp[i][j] = dp[i-1][j] + dp[i][j-1]。 根据以上分析,我们可以写出动态规划代码。

三、代码

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        dp[0][0] = 1;
        for (int i=0; i<m; i++){
            for (int j=0; j<n; j++){
                if (i > 0 && j == 0){
                    dp[i][j] = 1;
                }
                if (j > 0 && i == 0){
                    dp[i][j] = 1;
                }
                if (i > 0 && j > 0){
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        return dp[m-1][n-1];
    }
}

四、总结

本题使用动态规划,构造dp数组来记录矩阵matrix中到达每个格子的走法,最终返回dp[m-1][n-1]即为到达右下角格子的走法,时间复杂度为O(mn),空间复杂度为O(mn)。