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]。

相关推荐
WBluuue1 小时前
数据结构与算法:分块(一):块状数组、块状链表
数据结构·c++·算法·链表
圣保罗的大教堂1 小时前
leetcode 3619. 总价值可以被 K 整除的岛屿数目 中等
leetcode
步行cgn2 小时前
@ResponseBody 详解:Spring MVC 中把返回值直接写入响应体
java·spring·mvc
澳鹏Appen3 小时前
澳鹏重磅发布ExamOCRBench:面向端到端试卷判分的多任务基准
算法·benchmark·基准评测
jason成都3 小时前
RTKLIB 的 Java 移植版来了:rtklib-java v3.3.0 功能全景
java·gnss·rtklib·rtklib_java
LazyHunter93 小时前
JDK 28:Java 下一步方向解析与新特性展望
java·jdk
benjormin3 小时前
Java数据结构 二叉搜索树
数据结构·算法
m0_639906943 小时前
Java 重写 Override 与重载 Overload 区别、访问修饰符、static 关键字
java·开发语言
人工智能培训3 小时前
知识图谱:结构化表达实体与关系的知识组织技术
大数据·人工智能·算法·重构·生活·知识图谱
GIS数据转换器3 小时前
基于CIM的城市智慧供热监管服务平台
java·大数据·开发语言·人工智能·后端·物联网·struts