头图

不同路径

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

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

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

示例说明请见LeetCode官网。

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

解法一:递归法

首先,经过分析可知,到达任意一个单元格子的最后一步,可以从这个格子的左边过来,也可以从这个格子的上边过来,所以到达任意一个格子的步数是到它左边的步数加上到它上面格子的步数之和,所以可以用递归的方法求解,具体过程如下:

  • 如果m等于1或者n等于1,直接返回1;
  • 如果上面的条件不满足,则递归调用该方法求解uniquePaths(m - 1, n) + uniquePaths(m, n - 1)
解法二:迭代法
首先记录第一行的格子的数字都是1,然后由于第一列的值都是1,而下面的每一行的1 ~ n-1列的值都可以根据当前行的左边的格子和上一行的上面的格子的值相加所得,所以通过迭代得到每一行的值,最后返回最后一行的最后一个值即为最终结果。
public class LeetCode_062 {
    /**
     * 递归
     *
     * @param m
     * @param n
     * @return
     */
    public static int uniquePaths(int m, int n) {
        if (m == 1 || n == 1) {
            return 1;
        }
        return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);
    }

    /**
     * 迭代
     *
     * @param m
     * @param n
     * @return
     */
    public static int uniquePaths1(int m, int n) {
        if (m == 1 || n == 1) {
            return 1;
        }
        int[] row = new int[n];
        for (int i = 0; i < n; i++) {
            row[i] = 1;
        }
        for (int i = 2; i <= m; i++) {
            for (int x = 1; x < row.length; x++) {
                row[x] = row[x - 1] + row[x];
            }
        }
        return row[n - 1];
    }

    public static void main(String[] args) {
        System.out.println(uniquePaths(51, 9));
        System.out.println(uniquePaths1(51, 9));
    }
}
【每日寄语】 给自己信心,没有人可以帮你,不钻牛角尖,自然就海阔天空!

醉舞经阁
1.8k 声望7.1k 粉丝

玉树临风,仙姿佚貌!