LeetCode-62. 不同路径

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

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

问总共有多少条不同的路径?

例如,上图是一个7 x 3 的网格。有多少可能的路径?

说明:m 和 n 的值均不超过 100。

示例 1:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析:

还是典型的动态规划 思路:由递归反向推理->正向思考 字典存储重复数据->动态规划 

到达右下角的路径 = 到达左边格子的路径 + 到达上边格子的路径

递归代码:

public int uniquePaths(int m, int n) {
    if (m ==1 || n==1) {
        return 1;
    }
    int preX = 1;
    int preY = 1;
    if (m > 1) {
        preX = m -1;
    }
    if (n > 1) {
        preY = n -1;
    }
    return uniquePaths(preX,n) + uniquePaths(m,preY);
}

正向思考,字典存储重复数据代码:

public int uniquePaths2(int m, int n) {
    int[][] map = new int[m][n];
    map[0][0] = 1;
    for (int i = 0; i < m ; i++) {
        for (int j = 0; j < n ; j++) {
            if (i==0 && j==0) {
                continue;
            }
            int left = 0;
            int up = 0;
            if (i>0) {
                left = map[i - 1][j];
            }
            if (j>0) {
                up = map[i][j - 1];
            }
            map[i][j] = left + up;
        }
    }
    return map[m-1][n-1];
}

动态规划,将原题转换为一维数组

public  int uniquePaths3(int m, int n) {
    if (m <= 0 || n <= 0) {
        return 0;
    }
    int less = Math.min(m, n);
    int more = Math.max(m, n);

    int[] dp = new int[less]; 
    //第一行和第一列的值都为1
    Arrays.fill(dp, 1);

    for (int i = 1; i < more; i++) {
        for (int j = 1; j < less; j++) {
            dp[j] = dp[j - 1] + dp[j];
        }
    }
    return dp[less - 1];
}

发布了328 篇原创文章 · 获赞 23 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/lbh199466/article/details/103472100