数据结构与算法之动态规划: Leetcode 63. 不同路径 II (Typescript版)

news/2024/10/18 12:32:29/

不同路径 II

  • https://leetcode.cn/problems/unique-paths-ii/

描述

  • 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
    机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

  • 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

  • 网格中的障碍物和空位置分别用 1 和 0 来表示。

示例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

算法实现

1 )方案 1

function uniquePathsWithObstacles(obstacleGrid: number[][]): number {// 1. 获取当前矩阵的行和列const m = obstacleGrid.length // 行const n = obstacleGrid[0].length // 列// 2. 准备好最终的数据结构:初始化一个m x n的矩阵, 使用矩阵来计算const matrix: number[][] = new Array(m).fill(0).map(_ => new Array(n).fill(0));// 3. 遍历第一列,根据给定矩阵,初始化结果矩阵中第一列的值for (let i = 0; i < m && obstacleGrid[i][0] === 0; i++) {matrix[i][0] = 1}// 4. 遍历第一行,根据给定矩阵,初始化结果矩阵中第一行的值for (let i = 0; i < n && obstacleGrid[0][i] === 0; i++) {matrix[0][i] = 1}// 遍历原始矩阵这个二维数组,因为第一列和第一行已经遍历过了for (let i = 1; i < m; i++) {for (let j = 1; j < n; j++) {// 中间有障碍物,直接跳出当前if (obstacleGrid[i][j] === 1) continue// 分解后的问题求解公式,matrix[i][j] = matrix[i - 1][j] + matrix[i][j - 1]}}// 最后一步存储的值return matrix[m - 1][n - 1]
}
  • 这个是官方示例,逆向思维,原矩阵中1是障碍物,0是可移动的位置
  • 为了方便计算, 我们通过一个新的矩阵来累加计算,反过来,可移动的为1,障碍物为0
  • 因为可移动的位置参与计算,障碍物不参与计算
  • 核心公式是:F(m*n) = F((m-1) * n) + F(m * (n - 1))
  • 动态规划就是从基础开始计算,直到逐步接近我们最终的目标,也就是最后的一个位置 matrix[m - 1][n - 1]
  • 我一开始没想到怎么做,看了官方示例,瞬间就明白了

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

相关文章

AE(自动编码器)与VAE(变分自动编码器)的区别和联系?

他们各自的概念看以下链接就可以了&#xff1a;https://blog.csdn.net/weixin_43135178/category_11543123.html 这里主要谈一下他们的区别&#xff1f; 先说结论&#xff1a; VAE是AE的升级版&#xff0c;VAE也可以被看作是一种特殊的AEAE主要用于数据的压缩与还原&#xff0…

2023年春秋杯网络安全联赛 春季赛 wp

文章目录 Cryptocheckinbackdoor WebPhpstudyEasypyezrustqqcms MISCSudohappy2forensic盲人会藏在哪里piphackwordle PWNp2048easy_LzhiFTP_CHELL Crypto checkin 第一部分求解一下pell函数得到x,y def solve_pell(N, numTry 100):a[]b[]cf continued_fraction(sqrt(N))f…

Simulink 自动代码生成电机控制——永磁同步电机参数获取

目录 前言 极对数测量 电阻测量&#xff08;Rs&#xff09; 电感测量&#xff08;Ld和Lq&#xff09; 磁链测量 总结 前言 在建模之前或者需要更换一个新电机&#xff0c;需要获取目标电机的电气参数&#xff0c;如果参数不对&#xff0c;对于电流环参数的整定&#xff0…

kafka延时队列内部应用简介

kafka延时队列_悠然予夏的博客-CSDN博客 两个follower副本都已经拉取到了leader副本的最新位置&#xff0c;此时又向leader副本发送拉取请求&#xff0c;而leader副本并没有新的消息写入&#xff0c;那么此时leader副本该如何处理呢&#xff1f;可以直接返回空的拉取结…

Java学习路线(2)——基础语法

一、注释 注释的作用是对程序进行说明。 三种注释类型&#xff1a;单行注释、多行注释、文档注释。 /xxxx/ > 单行注释/* xxxxxx */ > 多行注释/** 项目名称&#xff1a;xxx 项目创建者&#xff1a;xxx */ > 文档注释 注释是一个开发过程中非常重要的东西&#xff0…

从零玩转设计模式之单例模式-danlimos

title: 从零玩转设计模式之单例模式 date: 2022-12-12 12:41:03.604 updated: 2022-12-23 15:35:29.0 url: https://www.yby6.com/archives/danlimos categories: - 单例模式 - 设计模式 tags: - Java模式 - 单例模式 - 设计模式 前言 单例设计模式是23种设计模式中最常用的设…

Java使用Groovy执行脚本的使用,GroovyShell Matespace内存溢出解决

目录 业务场景 使用了工具Groovy 遇到Metaspace内存溢出的问题 解决方案 业务场景 类似工作流的场景&#xff0c;需要判断 参数&#xff0c;是否满足流转条件。 随便举个例子: 新增商品资料。 如果是普通商品&#xff0c;状态为"待审核"&#xff0c; 如果为…

yolo v8

这个系列代码被封装的非常的精致&#xff0c;对二次开发不太友好&#xff0c;虽然也还是可以做些调节 这里写目录标题 模型的导出multi-scaleLossVFLDFL问题1问题2问题1 solution问题2 solutionFinally 其它yolo v8 里的哪些结构让它比yolo v5 更好C3 --> c2fdecoupled hea…