LeetCode 第62题:不同路径

107 阅读3分钟

LeetCode 第62题:不同路径

题目描述

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

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

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

难度

中等

题目链接

点击在LeetCode中查看题目

示例

示例 1:

示例1 输入:m = 3, n = 7 输出:28

示例 2:

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

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

示例 3:

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

提示

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

解题思路

动态规划

这是一个典型的动态规划问题。对于每个格子,到达它的路径数等于到达其上方格子的路径数加上到达其左方格子的路径数。

关键点:

  1. 状态定义:dp[i][j]表示到达位置(i,j)的不同路径数
  2. 状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
  3. 边界条件:第一行和第一列的格子只有一种到达方式
  4. 可以优化空间复杂度,只使用一维数组

具体步骤:

  1. 创建dp数组并初始化
  2. 处理边界情况(第一行和第一列)
  3. 按行遍历,应用状态转移方程
  4. 返回右下角的值

图解思路

算法步骤分析表

步骤操作状态说明
初始初始化[1,1,1]第一行全为1
第1行计算[1,2,3]第二行结果
第2行计算[1,3,6]第三行结果
最终返回dp[m-1][n-1]得到答案

状态/情况分析表

情况输入输出说明
最小网格m=1,n=11只有一种路径
单行/列m=1,n=71只能一直向右
正方形m=3,n=36对称情况

代码实现

C# 实现

public class Solution {
    public int UniquePaths(int m, int n) {
        // 使用一维数组优化空间复杂度
        int[] dp = new int[n];
        
        // 初始化第一行
        for (int j = 0; j < n; j++) {
            dp[j] = 1;
        }
        
        // 逐行计算
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[j] += dp[j-1];
            }
        }
        
        return dp[n-1];
    }
}

Python 实现

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        # 使用一维数组优化空间复杂度
        dp = [1] * n
        
        # 逐行计算
        for i in range(1, m):
            for j in range(1, n):
                dp[j] += dp[j-1]
        
        return dp[n-1]

C++ 实现

class Solution {
public:
    int uniquePaths(int m, int n) {
        // 使用一维数组优化空间复杂度
        vector<int> dp(n, 1);
        
        // 逐行计算
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[j] += dp[j-1];
            }
        }
        
        return dp[n-1];
    }
};

执行结果

  • 执行用时:24 ms
  • 内存消耗:25.3 MB

代码亮点

  1. 🎯 使用一维数组优化空间复杂度
  2. 💡 巧妙利用滚动数组思想
  3. 🔍 简化了边界条件处理
  4. 🎨 代码简洁高效

常见错误分析

  1. 🚫 数组初始化错误
  2. 🚫 边界条件处理不当
  3. 🚫 状态转移方程使用错误
  4. 🚫 返回值位置错误

解法对比

解法时间复杂度空间复杂度优点缺点
DFS递归O(2^(m+n))O(m+n)直观易懂超时
二维DPO(mn)O(mn)容易理解空间消耗大
一维DPO(mn)O(n)最优解法不够直观
数学组合O(min(m,n))O(1)性能最佳可能溢出

相关题目