LeetCode 62 & 63:不同路径 I & II(含障碍物)

LeetCode 62 & 63:不同路径 I & II(含障碍物)

📌 题目列表

题号 题目名称 难度
62 不同路径(Unique Paths) 中等
63 不同路径 II(Unique Paths II) 中等

📖 内容概要

机器人位于 m × n 网格的左上角 ,每次只能 向右或向下 移动一步,求到达右下角的路径数。

  • 62 题 :无障碍物

  • 63 题 :部分格子有障碍物,不可通行

✅ 动态规划

✅ 二维 DP

✅ 状态转移一致

✅ 面试高频题


💡 解题思路(核心)

一、状态定义

java 复制代码
dp[i][j] = 到达 (i, j) 的路径总数

二、状态转移方程(核心)

机器人只能从:

  • 上方 (i-1, j)
  • 左方 (i, j-1)
java 复制代码
dp[i][j] = dp[i-1][j] + dp[i][j-1]

三、初始化(非常关键)

✅ 无障碍版本(62)
  • 第一行:只能一直向右
  • 第一列:只能一直向下
java 复制代码
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;

✅ 有障碍物版本(63)
  • 遇到障碍物后,后面的格子不可达
  • 一旦中断,直接 break
java 复制代码
for (int i = 0; i < m; i++) {
    if (obstacleGrid[i][0] == 0) dp[i][0] = 1;
    else break;
}

四、障碍物处理(63 题重点)

java 复制代码
if (obstacleGrid[i][j] == 0) {
    dp[i][j] = dp[i-1][j] + dp[i][j-1];
}

✅ 遇到障碍物不做处理,只处理可走位置

✅ 障碍物格子路径数为 0

✅ 不参与状态转移


✅ AC 代码(Java)


✅ 62. 不同路径(无障碍)

java 复制代码
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[105][105];

        // 初始化第一行、第一列
        for (int i = 0; i < m; i++) dp[i][0] = 1;
        for (int j = 0; j < n; j++) dp[0][j] = 1;

        // 状态转移
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m - 1][n - 1];
    }
}

✅ 63. 不同路径 II(含障碍物)

java 复制代码
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;

        // 起点或终点有障碍
        if (obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1)
            return 0;

        int[][] dp = new int[m][n];

        // 初始化第一列
        for (int i = 0; i < m; i++) {
            if (obstacleGrid[i][0] == 0) dp[i][0] = 1;
            else break;
        }

        // 初始化第一行
        for (int j = 0; j < n; j++) {
            if (obstacleGrid[0][j] == 0) dp[0][j] = 1;
            else break;
        }

        // 状态转移
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (obstacleGrid[i][j] == 0) {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        return dp[m - 1][n - 1];
    }
}

⏱️ 复杂度分析

指标 复杂度
时间复杂度 O(m × n)
空间复杂度 O(m × n)(可优化为一维 DP)

🔍 两题对比总结

对比项 62 题 63 题
是否有障碍
初始化 全 1 遇障碍中断
状态转移 完全相同 增加障碍判断
难点 理解 DP 边界 + 障碍

✅ 一句话总结

62 题是基础二维 DP,63 题是它的"边界 + 条件增强版",核心仍然是 dp[i][j] = dp[i-1][j] + dp[i][j-1]

相关推荐
极创信息4 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒4 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院5 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
喜欢的名字被抢了5 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
zlinear数据采集卡5 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
城管不管5 小时前
重生——第九次面试2026.8.13某车一面
分布式·ai·面试·职场和发展·rabbitmq
数据知道5 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
杨石兴5 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学
江畔柳前堤6 小时前
Function Calling 与 Tool Calling:从认知到工程的全景深度解析
开发语言·网络·人工智能·深度学习·算法·机器学习·php
Navigator_Z6 小时前
LeetCode //C - 1192. Critical Connections in a Network
c语言·算法·leetcode