代码随想录算法训练营第三十九天|62.不同路径|63. 不同路径 II

news2024/12/23 18:07:52

LeetCode62.不同路径

       动态规划五部曲:

        1,确定dp数组(dp table)以及下标的含义:dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

        2,确定递推公式:想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。

        3,dp数组的初始化:如何初始化呢,首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。

        4,确定遍历顺序:这里要看一下递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。这样就可以保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值的。

        5,举例推导dp数组:如图所示:

        

 Java代码如下:

    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];
    }

LeetCode63. 不同路径 II

       动态规划五部曲:

        1,确定dp数组(dp table)以及下标的含义:dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

        2,确定递推公式:递推公式和62.不同路径一样,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。但这里需要注意一点,因为有了障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)。所以代码为:

if (obstacleGrid[i][j] == 0) { 
    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}

        3,dp数组如何初始化:在62.不同路径 (opens new window)不同路径中我们给出如下的初始化:

vector<vector<int>> dp(m, vector<int>(n, 0)); // 初始值为0
for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;

        因为从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。但如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0。如图:

 

下标(0, j)的初始化情况同理。所以本题初始化代码为:

vector<vector<int>> dp(m, vector<int>(n, 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循环的终止条件,一旦遇到obstacleGrid[i][0] == 1的情况就停止dp[i][0]的赋值1的操作,dp[0][j]同理。

        4,确定遍历顺序:从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。代码如下:

for (int i = 1; i < m; i++) {
    for (int j = 1; j < n; j++) {
        if (obstacleGrid[i][j] == 1) continue;
        dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
    }
}

        5,举例推导dp数组:拿示例1来举例如题:

 对应的dp table 如图:

 

 Java代码如下:

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];
    }   

 

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

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

相关文章

cpu飚高的排查思路

cpu的衡量指标 使用率util&#xff1a;代表的是单位时间内CPU繁忙情况的统计。操作系统对cpu的管理就是利用周期的tick时钟中断&#xff0c;将cpu的使用划分时间片。每个时间片内去执行不同进程/线程里的代码。所以cpu的使用率统计其实也是以tick为单位的&#xff1a;统计周期…

开源代码分享(1)—考虑经济性的储能运行优化

参考文献&#xff1a; [1]Practical operation strategies for pumped hydroelectric energy storage (PHES) utilising electricity price arbitrage - ScienceDirect [2]Towards an objective method to compare energy storage technologies: development and validation of…

Python——Flask快速开发一个物资管理平台(源码+适合大作业)

目录 一、前言 二、项目展示 三、代码包 四、项目简介 五、运行步骤 一、前言 Flask 框架结合原生的 HTML 和 Bootstrap 可以快速开发 Web 应用程序。 Flask 框架是 Python 中一个轻量级的 Web 应用框架&#xff0c;它非常适合构建小型项目和原型化开发。Flask 框架具有可扩展的…

K8S利用nginx快速部署一个网站之基本概念(十)

在Kubernetes部署应用程序流程 使用Deployment控制器部署镜像&#xff1a; kubectl create deployment web --imagenginx --replicas3 kubectl get deploy,pods 使用Service将Pod暴露出去&#xff1a; kubectl expose deployment web --port80 --target-port80 --typeNodePor…

Pyside6-第六篇-各按钮的信号与槽

今天是Pyside6的第六篇内容。一起来看看各按钮的信号与槽。 from PySide6.QtCore import Qt from PySide6.QtGui import QAction from PySide6.QtWidgets import QApplication, QWidget, QRadioButton, \QPushButton, QCheckBox, QToolButton, QMenuclass Example(QWidget):def…

使用BERT进行文本分类

本范例我们微调transformers中的BERT来处理文本情感分类任务。 我们的数据集是美团外卖的用户评论数据集。 模型目标是把评论分成好评(标签为1)和差评(标签为0)。 #安装库 #!pip install datasets #!pip install transformers[torch] #!pip install torchkeras 公众号算法美食…

你知道ping命令是如何工作的吗?

你知道ping命令是如何工作的吗&#xff1f; 我们用来测试一台机器与另一台机器的网络连通性一般会使用ping命令&#xff0c;那么你知道ping命令是如何工作的吗&#xff1f;ping命令是基于ICMP协议工作的。 一、介绍ICMP协议 因特网控制报文协议ICMP&#xff08;Internet Con…

安卓大作业 咖啡展示App

系列文章 安卓大作业 咖啡展示App 文章目录 系列文章1&#xff0e;背景2&#xff0e;所有截图3&#xff0e;总结4. 源代码获取 1&#xff0e;背景 为了便于用户对于咖啡信息的浏览&#xff0c;我设计了一个咖啡展示的app。可以在这个App中查看到一些咖啡的信息&#xff0c;点…

爬虫语言最好用的是那种?

目前最好用的爬虫语言有多种选择&#xff0c;具体的选择取决于你的需求和个人偏好。Python是较为流行的爬虫语言之一&#xff0c;其生态系统丰富&#xff0c;拥有大量优秀的爬虫框架和工具。另外&#xff0c;JavaScript、Go、Ruby等编程语言也可以用于爬虫开发。总之&#xff0…

设置ubuntu下SVN服务开机自启

目录 0.背景环境 1.开机自启步骤 0.背景环境 1&#xff09;ubuntu下&#xff0c;已搭建好svn版本库&#xff0c;具体搭建方法参考文末的其他博客链接 2&#xff09;在搭svn服务器的过程中&#xff0c;发现ubuntu重启后&#xff0c;svn服务就关闭了 svn正常开启时见下图 所以…

为什么大多数企业数字化转型失败率高达80%?

数字化转型失败率为什么这么高&#xff1f; 多年的转型研究表明&#xff0c;企业数字化转型的成功率还不到 30%。 麦肯锡2023年报告显示&#xff0c;只有 16% 的受访者表示他们组织的数字化转型成功地提高了绩效&#xff0c;并使他们能够长期维持变革。 即使是精通数字技术的行…

十五周算法训练营——回溯算法

今天是十五周算法训练营的第十周&#xff0c;主要讲回溯算法专题。&#xff08;欢迎加入十五周算法训练营&#xff0c;与小伙伴一起卷算法&#xff09; 解决一个回溯问题&#xff0c;实际上就是一个决策树的遍历过程&#xff0c;只需要思考三个问题&#xff1a; 路径&#xff1…

市值暴涨8000亿,马斯克告诉了美国同行,为啥需要中国市场?

马斯克访华仅仅40多个小时&#xff0c;却带动了股价连涨5天&#xff0c;涨幅最高达到20%&#xff0c;市值飙涨8000亿元人民币&#xff0c;马斯克也因此再度问鼎全球首富之位&#xff0c;凸显出中国之行给他带来的巨大好处。 一、中国市场带动了特斯拉的辉煌 2018年马斯克为产能…

依据换行符分割字符串numpy.char.splitlines()含换行符与回车符的区别

【小白从小学Python、C、Java】 【等级考试500强双证书考研】 【Python-数据分析】 依据换行符分割字符串 numpy.char.splitlines() 含换行符与回车符的区别 [太阳]选择题 以下说法错误的是&#xff1a; import numpy as np a "I\nLove\rChina\r\nforever" print(&q…

APACHE-ATLAS-2.1.0 - 安装HIVE HOOK(六)

写在前面 本博文以获取HIVE元数据为例&#xff0c;进行流程和源码的分析。 请提前安装好HADOOP和HIVE的环境&#xff0c;用于测试。 ATLAS官网&#xff1a;https://atlas.apache.org/#/HookHive ATLAS支持的元数据源 什么是Hive Hook&#xff08;钩子&#xff09; HOOK是一种…

可视化的三种图结构方案 (canvas、fabric、G6)

原生 canvas、fabric 以及 G6&#xff0c;三种方案各有优劣势 原生 canvasfabricG6优点灵活、自由、可定制化非常强封装了 canvas 的 api&#xff0c;使用简单灵活提供了复杂树、图等 api&#xff0c;只需要按照文档配置即可缺点开发复杂、耗时对于构建大型树、图等复杂、耗时…

chatgpt赋能python:选择函数:Python实现之道

选择函数&#xff1a;Python 实现之道 什么是选择函数&#xff1f; 在 SEO 中&#xff0c;选择函数是指搜索引擎在对网站内容进行排名时所采用的一种规则。选择函数由搜索引擎定义&#xff0c;其目的在于建立一个算法来确定哪些网站会出现在搜索结果的前几页中。对于网站管理…

百度视频质量评测的实践之路

视频编解码技术日新月异&#xff0c;新的编解码技术赋予视频业务新的应用场景和新的用户视听体验。同时&#xff0c;视频作为带宽消耗大户&#xff0c;如何在视听体验和视频带宽之间取得最优的平衡是一个永恒的话题。视频质量评测主要用来回答&#xff1a;体验是否改善、带宽是…

chatgpt赋能python:如何用Python制作动画?

如何用Python制作动画&#xff1f; Python作为一种优秀的编程语言&#xff0c;可以用于不同领域的编程。其中&#xff0c;Python也可以被用于创建动画。使用Python的主要好处之一是其强大的Matplotlib库&#xff0c;它可以帮助我们更轻松地创建可视化效果。 什么是Matplotlib…

chatgpt赋能python:Python如何取出List中的数据

Python如何取出List中的数据 在Python中&#xff0c;列表&#xff08;List&#xff09;是一种非常常见的数据类型&#xff0c;它可以存储任意类型的数据&#xff0c;并且可以按照下标索引来访问其中的元素。本篇文章将介绍如何使用Python来取出List中的数据。 常规方法 在Py…