力扣LeetCode: 63 不同路径Ⅱ

news/2025/2/12 15:29:30/

题目:

给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。

网格中的障碍物和空位置分别用 1 和 0 来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。

返回机器人能够到达右下角的不同路径数量。

测试用例保证答案小于等于 2 * 10^9

示例 1:

输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共2条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

示例 2:

输入:obstacleGrid = [[0,1],[0,0]]
输出:1

提示:

  • m == obstacleGrid.length
  • n == obstacleGrid[i].length
  • 1 <= m, n <= 100
  • obstacleGrid[i][j] 为 0 或 1

解法:动态规划

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size(), n = obstacleGrid[0].size();vector<vector<int>> dp(m, vector<int>(n, 0));for (int i = 0; i < m; i++) {if (obstacleGrid[i][0])break;dp[i][0] = 1;}for (int j = 0; j < n; j++) {if (obstacleGrid[0][j])break;dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j])continue;dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
};

代码解释

  1. 初始化:

    • m 和 n 分别表示网格的行数和列数。

    • dp 是一个 m x n 的二维数组,用于存储到达每个格子的路径数。初始时,所有格子的路径数都设为 0

  2. 边界条件:

    • 首先处理第一列。如果某个格子是障碍物(obstacleGrid[i][0] == 1),那么从该格子开始往下的所有格子都无法到达,因此 dp[i][0] 保持为 0。否则,dp[i][0] 设为 1,因为只有一种路径(一直向下)可以到达该格子。

    • 然后处理第一行。如果某个格子是障碍物(obstacleGrid[0][j] == 1),那么从该格子开始往右的所有格子都无法到达,因此 dp[0][j] 保持为 0。否则,dp[0][j] 设为 1,因为只有一种路径(一直向右)可以到达该格子。

  3. 动态规划转移:

    • 对于每个格子 (i, j),如果它不是障碍物(obstacleGrid[i][j] == 0),那么到达该格子的路径数等于从上方格子 (i-1, j) 和左方格子 (i, j-1) 到达该格子的路径数之和,即 dp[i][j] = dp[i-1][j] + dp[i][j-1]

    • 如果该格子是障碍物,则 dp[i][j] 保持为 0,因为无法通过该格子。

  4. 返回结果:

    • 最终,dp[m-1][n-1] 存储的就是从左上角到右下角的不同路径数。


http://www.ppmy.cn/news/1570746.html

相关文章

在亚马逊云科技上云原生部署DeepSeek-R1模型(下)

在本系列的上篇中&#xff0c;我们介绍了如何通过Amazon Bedrock部署并测试使用了DeepSeek模型。在接下来的下篇中小李哥将继续介绍&#xff0c;如何利用亚马逊的AI模型训练平台SageMaker AI中的&#xff0c;Amazon Sagemaker JumpStart通过脚本轻松一键式部署DeepSeek预训练模…

android 动态库加载机制

省流&#xff1a;android 不兼容 glibc&#xff0c;而是写了一套独立的 c 运行时库 (bionic libc)&#xff0c;为移动设备和 google 自己推的东西做了大量优化。在这套工具链里&#xff0c;aosp 实现了一个兼容 bionic libc 的链接器&#xff0c;放到系统中代替 ld。 这个链接…

【含文档+PPT+源码】基于Python校园跑腿管理系统设计与实现

项目介绍 本课程演示的是一款基于Python校园跑腿管理系统设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Python学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.…

深度整理总结MySQL——事务简介

事务简介 什么是事务为什么需要事务事务特性原子性现实世界的转账操作是不可分割的数据库世界的转账操作可能是多个步骤可能发生的错误和故障 隔离性一致性数据库的一致性 持久性 事务的状态状态分析活动的&#xff08;Active&#xff09;部分提交的(Partially Committed)提交的…

67.为日志添加行号,第一行不加 C#例子

事先要在本地创建一个叫该名称的文件&#xff0c;在代码路径下。TempFile.txt 你可以自由的输入一些换行符&#xff0c;或者复制一片文章进去&#xff0c;然后运行代码就会发现有行号。 using System; class Program {static void Main(string[] args){string FilePath &quo…

pytest.fixture

pytest.fixture 是 pytest 测试框架中的一个非常强大的功能,它允许你在测试函数运行前后执行一些设置或清理代码。以下是关于 pytest.fixture 的详细介绍: 一、定义与用途 pytest.fixture 是一个装饰器,用于标记一个函数为 fixture。Fixture 函数中的代码可以在测试函数运…

AIGC-辅助小说(斗破苍穹为例)创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

第三个Qt开发实例:利用之前已经开发好的LED驱动在Qt生成的界面中控制LED2的亮和灭

前言 上一篇博文 https://blog.csdn.net/wenhao_ir/article/details/145459006 中&#xff0c;我们是直接利用GPIO子系统控制了LED2的亮和灭&#xff0c;这篇博文中我们利用之前写好的LED驱动程序在Qt的生成的界面中控制LED2的亮和灭。 之前已经在下面两篇博文中实现了LED驱动…