代码随想录刷题day39|不同路径不同路径II

文章目录

  • day39学习内容
  • 一、不同路径
    • 2.1、动态规划五部曲
      • 1.1.1、 确定dp数组(dp table)以及下标的含义
      • 1.1.2、确定递推公式
      • 1.1.3、 dp数组如何初始化
      • 1.1.4、确定遍历顺序
      • 1.1.5、计算并返回最终结果
    • 1.2、代码
  • 二、不同路径II
    • 2.1、动态规划五部曲
      • 2.1.1、 确定dp数组(dp table)以及下标的含义
      • 2.1.2、确定递推公式
        • 初始状态
        • 状态转移方程
        • 这个方程的含义是:
      • 2.1.3、 dp数组如何初始化
      • 2.1.4、确定遍历顺序
      • 2.1.5、计算并返回最终结果
    • 2.2、代码
      • 2.2.1、obstacleGrid[m - 1][n - 1] == 1,为什么这句代码表示有障碍物
  • 总结
    • 1.感想
    • 2.思维导图


day39学习内容

day39主要内容

  • 不同路径
  • 不同路径II

声明
本文思路和文字,引用自《代码随想录》

一、不同路径

509.原题链接

2.1、动态规划五部曲

1.1.1、 确定dp数组(dp table)以及下标的含义

- 表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

1.1.2、确定递推公式

dp[i][j] = dp[i - 1][j] + dp[i][j - 1]

1.1.3、 dp数组如何初始化

dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,dp[0][j]同理。

1.1.4、确定遍历顺序

从前向后遍历,没啥好说的

1.1.5、计算并返回最终结果

return dp[m - 1][n - 1];

1.2、代码

class Solution {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int i = 0; i < n; i++) {dp[0][i] = 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];}
}

二、不同路径II

70.原题链接

2.1、动态规划五部曲

2.1.1、 确定dp数组(dp table)以及下标的含义

- 表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

2.1.2、确定递推公式

本题需要在没有障碍的时候进行推导。
递推公式是如何推导出来的?
动态规划问题的解决关键在于找出合适的状态表示和状态转移方程。在这个问题中,我们的目标是计算从网格的左上角到右下角的所有不同路径的数量,同时考虑到路径上可能存在障碍物。

定义dp[i][j]为到达网格中(i, j)位置的不同路径数量。这里,ij分别表示目标位置的行和列索引。

初始状态
  • 对于第一列dp[i][0],如果从(0, 0)(i, 0)之间没有障碍物,那么只存在一条路径(一直向下),否则路径数为0。
  • 对于第一行dp[0][j],如果从(0, 0)(0, j)之间没有障碍物,那么只存在一条路径(一直向右),否则路径数为0。
状态转移方程

对于网格中的任意位置(i, j)(除了第一行和第一列),到达该位置的路径可以从两个方向来:从上面的位置(i-1, j)向下走一步,或者从左边的位置(i, j-1)向右走一步。因此,到达(i, j)位置的路径数量是这两个方向路径数量的和,但这只适用于没有障碍物的情况。如果(i, j)位置有障碍物,则到达该位置的路径数量为0。

因此,状态转移方程可以表示为:

if obstacleGrid[i][j] == 0:dp[i][j] = dp[i-1][j] + dp[i][j-1]
else:dp[i][j] = 0
这个方程的含义是:
  • 如果(i, j)位置没有障碍物(obstacleGrid[i][j] == 0),那么dp[i][j](到达(i, j)的路径数量)等于从上面来的路径数量(dp[i-1][j])加上从左边来的路径数量(dp[i][j-1])。
  • 如果(i, j)位置有障碍物,那么到达该位置的路径数量为0(dp[i][j] = 0),因为不能通过障碍物。

2.1.3、 dp数组如何初始化

for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {dp[i][0] = 1;
}
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {dp[0][j] = 1;
}

2.1.4、确定遍历顺序

从前向后遍历,没啥好说的

2.1.5、计算并返回最终结果

return dp[m - 1][n - 1];

2.2、代码

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] dp = new int[m][n];if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {return 0;}for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {dp[i][0] = 1;}for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;}}return dp[m - 1][n - 1];}
}

2.2.1、obstacleGrid[m - 1][n - 1] == 1,为什么这句代码表示有障碍物

在这段代码中,obstacleGrid[m - 1][n - 1] == 1用于检查网格的右下角是否有障碍物。这是因为obstacleGrid是一个二维数组,其中m表示网格的行数,n表示网格的列数。

obstacleGrid[m - 1][n - 1] == 1时,这表示网格的终点(即右下角的位置)存在障碍物,无法到达。由于问题的要求是计算从左上角到右下角的所有可能路径,如果终点本身就是障碍物,那么显然没有任何路径可以到达终点,因此在这种情况下直接返回0,表示没有可行的路径。

总结

1.感想

  • 今天的2题,动态转移方程都好难想的出来。。。

2.思维导图

本文思路引用自代码随想录,感谢代码随想录作者。-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Flink实现Kafka到MySQL的数据流转换:一个基于Flink的实践指南

使用Flink实现Kafka到MySQL的数据流转换 在现代数据处理架构中&#xff0c;Kafka和MySQL是两种非常流行的技术。Kafka作为一个高吞吐量的分布式消息系统&#xff0c;常用于构建实时数据流管道。而MySQL则是广泛使用的关系型数据库&#xff0c;适用于存储和查询数据。在某些场景…

小米SU7 我劝你再等等

文 | AUTO芯球 作者 | 李逵 我必须承认我一时没忍住 犯错了 我不会被我老婆打吧 感觉有点慌呀 这不前两天 我刚提了台问界M9嘛 但是昨晚看小米汽车发布会 是真的被雷总感染到了 真的没忍住 我又冲了台小米SU7 Pro版 本来我是准备抢创始版的 结果1秒钟时间 点进去就…

yolov5 v7.0打包exe文件,使用C++调用

cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径&#xff0c;把default.yaml复制放到相应的路径下。&#xff08;缺少相应…

杨辉三角形(c++实现)

题目 下面的图形是著名的杨辉三角形&#xff1a; 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数列&#xff1a; 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, … 给定一个正整数 N&#xff0c;请你输出数列中第一次出现 N 是在第几个数&a…

实现 Element UI el-table 树形数据的懒加载

当面对大量数据时&#xff0c;一次性加载所有数据可能会导致性能问题。为了解决这一问题&#xff0c;我们可以实现树形数据的懒加载。本文将介绍如何在使用 Element UI 的 Vue 应用中为 el-table 组件的树形数据添加懒加载功能。 懒加载的基本概念 懒加载是一种优化网页或应用…

中国31个省农村用电量(2000-2022年)

数据介绍&#xff1a; 农村用电量是一个动态变化的数据&#xff0c;受到多种因素的影响&#xff0c;包括农村经济发展、人口增长、农业生产活动增加以及电力设备的升级改造等。随着农村经济的发展和农民生活水平的提高&#xff0c;农村用电量呈现出逐年增长的趋势。同时&#…

收获的果实将远远超出你的想象

在追求目标的过程中&#xff0c;刚开始的时候努力所带来的收获可能显得微不足道。然而&#xff0c;随着时间的推移&#xff0c;你会逐渐发现收获的增长是远远超过最初付出的努力的。这就像种下一颗种子&#xff0c;一开始你可能需要付出很多精力去浇灌它&#xff0c;但随着时间…

消息中间件区别

ActiveMQ 我们先看ActiveMQ。其实一般早些的项目需要引入消息中间件&#xff0c;都是使用的这个MQ&#xff0c;但是现在用的确实不多了&#xff0c;说白了就是有些过时了。我们去它的官网看一看&#xff0c;你会发现官网已经不活跃了&#xff0c;好久才会更新一次。 它的单机吞…

LeetCode 2908.元素和最小的山形三元组 I:贪心(两次遍历)——双O(n)复杂度

【LetMeFly】2908.元素和最小的山形三元组 I&#xff1a;贪心&#xff08;两次遍历&#xff09;——双O(n)复杂度 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-sum-of-mountain-triplets-i/ 给你一个下标从 0 开始的整数数组 nums 。 如果下标三元组 (i,…

查找某数据在单链表中出现的次数

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct LinkNode {ElemType data;LinkNode* next; }LinkNode, * LinkList; //尾插法建立单链表 void creatLinkList(LinkList& L) {L (LinkNode*)mallo…

JAVA反射基础篇

简介 Java反射是指在运行时动态地获取类的信息&#xff0c;并可以通过该信息来操作类或对象。通过反射&#xff0c;我们可以在运行时获取类的字段、方法、构造函数等信息&#xff0c;并能够动态地创建对象、调用方法、访问和修改字段的值。 一丶概念 反射是Java语言的一种机…

2024.2.5力扣每日一题——跳跃游戏6

2024.2.5 题目来源我的题解方法一 深度搜索实现方法二 动态规划双端队列 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1696 我的题解 方法一 深度搜索实现 使用深度搜索&#xff0c;每次选择一个在范围内的跳跃点&#xff0c;但是时间通不过。 时间复杂度&#xff1a…

Kafka配置与部署CentOS7[]

静态IP设置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.128 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…

设计模式之解释器模式的魅力:让代码读懂你的语言

目录 一、什么是解释器模式 二、解释器模式的应用场景 三、解释器模式的优缺点 3.1. 优点 3.2. 缺点 四、解释器模式示例 4.1. 问题描述 4.2. 问题分析 4.3. 代码实现 4.4. 优化方向 五、总结 一、什么是解释器模式 解释器模式&#xff08;Interpreter pattern&…

kubernetes(K8S)学习(七):K8S之系统核心组件

K8S之系统核心组件 K8s系统核心组件1.1 Master和Node1.2 kubeadm1.3 先把核心组件总体过一遍1.4 Kubernetes源码查看方式1.5 kubectl1.6 API Server1.7 集群安全机制之API Server1.8 Scheduler1.9 kubelet1.10 kube-proxy K8s系统核心组件 1.1 Master和Node 官网 &#xff1a;…

360奇酷刷机 360刷机助手 QGDP360手机QGDP刷机

360奇酷刷机 360刷机助手 QGDP破解版360手机QGDP刷机 360手机刷机资源下载链接&#xff1a;360rom.github.io 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360奇酷刷机&#xff1a;360高通驱动安装 360手机刷机驱动&#xff1b;手机内置&#xff0c;可通过USB文件传输…

搜索与图论——染色法判定二分图

一个图是二分图当且仅当这个图中不含奇数环 由于图中没有奇数环&#xff0c;所以染色过程中一定没有矛盾 所以一个二分图一定可以成功被二染色&#xff0c;反之在二染色的过程中出现矛盾的图中一定有奇数环&#xff0c;也就一定不是二分图 #include<iostream> #includ…

【c++初阶】类与对象(中)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

2024.3.30力扣刷题记录-二叉树学习记录2(未完)

一、学习视频 如何灵活运用递归&#xff1f;【基础算法精讲 10】_哔哩哔哩_bilibili 二、跟练代码 1. 100. 相同的树 递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # …

Transformer论文阅读

Transformer论文阅读 摘要结论1 Introduction &#xff08;导言&#xff09;2 Background3 Model Architecture3.1 Encoder and Decoder StacksEncoderLayer NormDecoder 3.2 Attention3.2.1 Scaled Dot-Product Attention3.2.2 Scaled Dot-Product Attention3.2.3 Application…