算法——LeetCode62. 不同路径

62. 不同路径

原题链接

题目:

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

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

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

算法——LeetCode62. 不同路径_第1张图片

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

 

示例 1:

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

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  3. 向下 -> 向右 -> 向右

示例 2:

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

 

提示:

  • 1 <= m, n <= 100
  • 题目数据保证答案小于等于 2 * 10 ^ 9

题解1:动态规划法

要点:

  1. 状态数组:dp[i][j],表示到达 位置(i,j)的最多路径数
  2. 状态转移方程: dp[i][j]=dp[i][j-1]+dp[i-1][j]
  • 由于只能向右走或向下走,所以到达位置(i,j)的路径数为该位置的上一个位置和左一个位置最多路径数之和
    即 dp[i][j-1]+dp[i-1][j]
  • 初始状态 dp[0][j]=1 最上边一行只有一条路径 全为1, dp[i][0]=1 最左边一列也只有一条路径,全为1,这里在递推时增加判断即可

代码:

    class Solution {
     
        public int uniquePaths(int m, int n) {
     
            int dp[][]=new int[m][n];
            for (int i = 0; i < m; i++) {
     
                for (int j = 0; j < n; j++) {
     
                    if(i==0||j==0){
     //最上一行或者最左一列
                        dp[i][j]=1;
                    }else {
     
                        dp[i][j]=dp[i][j-1]+dp[i-1][j];
                    }

                }

            }
            return dp[m-1][n-1];

        }


    }

复杂度分析:

  • 时间复杂度:O(m*n)
  • 空间复杂度:O(m * n)

题解2:DFS递归(超时)

代码:

    class Solution {
     
        public int uniquePaths(int m, int n) {
     
            Set<String> res = new HashSet<>();
            findRoad(m, n, 0, 0, res, "");
            return res.size();
        }

        //递归函数,参数依次为:x 当前横坐标,y 当前纵坐标,res 当前到终点的路径, s 当前所走路径
        //其中 使用 String 来保存路径,"e"代表向右走,"s"代表向下走
        public void findRoad(int m, int n, int x, int y, Set<String> res, String s) {
     
            //边界条件判断
            if (x == m - 1 && y == n - 1) {
     
                if (!res.contains(s)) {
     
                    res.add(s);
                    return;
                }
            } else if (x < m - 1 && y < n - 1) {
     //都没有到边界,可以沿两个方向走
                findRoad(m, n, x + 1, y, res, s + "e");
                findRoad(m, n, x, y + 1, res, s + "s");
            } else if (x > m - 1 || y > n - 1) {
     //已经超出边界
                return;
            } else if (x < m - 1 && y == n - 1) {
     //向右走
                findRoad(m, n, x + 1, y, res, s + "e");
            } else if (x == m - 1 && y < n - 1) {
     //向下走
                findRoad(m, n, x, y + 1, res, s + "s");
            }

        }

    }

参考题解:
动态规划题解

你可能感兴趣的:(算法,动态规划,算法,leetcode,数据结构)