当前位置: 首页 > news >正文

算法29:不同路径问题(力扣62和63题)--针对算法28进行扩展

题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

分析:

假设为3行2列的二维数组

1. 向右---向下---向下

2. 向下---向下---向右

3. 向下--向右---向下

可以推导

1. 一直向右和一直向下,每种走法只有1种走法,没有其他可以旋转的空间。因此

11
12
1

2 、那么到达dp[1][1] 的走法就是 1 + 1 = 2;

3. 那么到达右下角dp[2][1] 就是 2 + 1 = 3; 即3种走法

分析2:

假设有3行7列

1. 按行走,只有1种走法

2、按列走,只有一种走法,可得

1111111
1
1

那么dp[1][1] 就是 dp[0][1] + dp[1][0] 即 1+ 1 = 2;依次类推可得

1111111
1234567
1

第三行还是按照这种方式推导,可得

1111111
1234567
13610152128

因此,针对3行7列的二维数组,可得28种走法

代码实现:

public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];//第一行都为1for (int col = 0; col < n; col++) {dp[0][col] = 1;}//第一列都为1for (int row = 0; row < m; row++) {dp[row][0] = 1;}for (int row = 1; row < m; row++) {for(int col = 1; col < n; col++) {dp[row][col] = dp[row][col - 1] + dp[row - 1][col];}}return dp[m-1][n-1];}

还是一样的问题,以上代码的时间复杂度为O(m*n), 空间复杂度也为O(m*n). 如果100行100列的二维数组,将浪费100*100的空间复杂度。

空间压缩进行优化:

 public int uniquePaths2(int m, int n) {int[] dp = new int[n];//第一行都为1for (int col = 0; col < n; col++) {dp[col] = 1;}for (int row = 1; row < m; row++) {dp[0] = 1;for (int col = 1; col < n; col++) {dp[col] = dp[col -1] + dp[col];}}return dp[n -1];}

完整代码:

package code03.动态规划_07.lesson4;//力扣62题
// https://leetcode.cn/problems/unique-paths/description/
public class DiffPathSum_02 {public int uniquePaths(int m, int n) {int[][] dp = new int[m][n];//第一行都为1for (int col = 0; col < n; col++) {dp[0][col] = 1;}//第一列都为1for (int row = 0; row < m; row++) {dp[row][0] = 1;}for (int row = 1; row < m; row++) {for(int col = 1; col < n; col++) {dp[row][col] = dp[row][col - 1] + dp[row - 1][col];}}return dp[m-1][n-1];}public int uniquePaths2(int m, int n) {int[] dp = new int[n];//第一行都为1for (int col = 0; col < n; col++) {dp[col] = 1;}for (int row = 1; row < m; row++) {dp[0] = 1;for (int col = 1; col < n; col++) {dp[col] = dp[col -1] + dp[col];}}return dp[n -1];}
}

力扣测试通过:

题目:力扣63题: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

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

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

分析:

1. 这一题其实跟上面一体解法相同,唯一的不同之处是有障碍物。

2. 第一行和第一列遇到障碍物,那么后面的路都走不通而已

3. 后面的推导,当前方格为障碍物,设置0代表走不通;如果不为0,则按照原有逻辑进行推导即可

完整代码:

package code03.动态规划_07.lesson4;//力扣63题
// https://leetcode.cn/problems/unique-paths-ii/description/
public class DiffPathSum_03 {//时间复杂度 O(m*n), 空间复杂度 O(m*n)public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;//obstacleGrid[0][0] == 1 代表左上角第一个就是障碍物//obstacleGrid[m-1][n-1] == 1 代表右下角最后一个是障碍物if (obstacleGrid == null|| obstacleGrid.length == 0|| obstacleGrid[0][0] == 1|| obstacleGrid[m-1][n-1] == 1) {return 0;}int[][] dp = new int[m][n];//处理第一行dp[0][0] = 1;for (int col = 1; col < n; col++) {//如果当前列为1, 或者前一列为0. 代表遇到障碍物。后面路走不通,全部变为0if (obstacleGrid[0][col] == 1 || dp[0][col -1] == 0) {dp[0][col] = 0;} else {//第一行只有1条路dp[0][col] = 1;}}//处理第一列for (int row = 1; row < m; row++) {//如果当前列为1, 或者上一列为0. 代表遇到障碍物。后面路走不通,全部变为0if (obstacleGrid[row][0] == 1 || dp[row-1][0] == 0) {dp[row][0] = 0;} else {//第一行只有1条路dp[row][0] = 1;}}for (int row = 1; row < m; row++) {for(int col = 1; col < n; col++) {//如果当前列有障碍物,此条路走不通。当前列的值变为0//否则,按照原有的逻辑进行计算dp[row][col] = obstacleGrid[row][col] == 1 ? 0: dp[row][col - 1] + dp[row - 1][col];}}return dp[m-1][n-1];}//空间压缩//时间复杂度 O(m*n), 空间复杂度 O(n)public int uniquePathsWithObstacles2(int[][] obstacleGrid) {int m = obstacleGrid.length;int n = obstacleGrid[0].length;//obstacleGrid[0][0] == 1 代表左上角第一个就是障碍物//obstacleGrid[m-1][n-1] == 1 代表右下角最后一个是障碍物if (obstacleGrid == null|| obstacleGrid.length == 0|| obstacleGrid[0][0] == 1|| obstacleGrid[m-1][n-1] == 1) {return 0;}int[] dp = new int[n];//处理第一行dp[0] = 1;for (int col = 1; col < n; col++) {//如果当前列为1, 或者前一列为0. 代表遇到障碍物。后面路走不通,全部变为0if (obstacleGrid[0][col] == 1 || dp[col -1] == 0) {dp[col] = 0;} else {//第一行只有1条路dp[col] = 1;}}for (int row = 1; row < m; row++) {//当前列为障碍物或者上一列为障碍物,都走不通。dp[0] =  (obstacleGrid[row][0] == 1 || dp[0] == 0) ? 0 : 1;for(int col = 1; col < n; col++) {//如果当前列有障碍物,此条路走不通。当前列的值变为0//否则,按照原有的逻辑进行计算dp[col] = obstacleGrid[row][col] == 1 ? 0 : dp[col -1] + dp[col];}}return dp[n-1];}public static void main(String[] args) {DiffPathSum_03 test = new DiffPathSum_03();int[][] arr = {{0, 0, 0},{0, 1, 0},{0, 0, 0}};System.out.println(test.uniquePathsWithObstacles2(arr));}
}

相关文章:

算法29:不同路径问题(力扣62和63题)--针对算法28进行扩展

题目&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff0…...

openGauss学习笔记-188 openGauss 数据库运维-常见故障定位案例-core问题定位

文章目录 openGauss学习笔记-188 openGauss 数据库运维-常见故障定位案例-core问题定位188.1 磁盘满故障引起的core问题188.1.1 问题现象188.1.2 原因分析188.1.3 处理办法 188.2 GUC参数log_directory设置不正确引起的core问题188.2.1 问题现象188.2.2 原因分析188.2.3 处理办…...

kubernetes入门到进阶(5)

目录 镜像仓库&#xff1a;怎么用好docker hub这个宝藏 什么是镜像仓库&#xff08;Registry&#xff09; 什么是docker hub 如何在docker hub上挑选镜像 docker hub上进行概念股命名规则是什么 该怎么上传自己的镜像 离线环境该怎么办 小结 镜像仓库&#xff1a;怎么用好docke…...

【字典树Trie】LeetCode-139. 单词拆分

139. 单词拆分。 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode&q…...

pytest常用的第三方插件介绍

本节介绍了如何安装和使用第三方插件。如果你想要编写自己的插件&#xff0c;请参阅“编写插件”。 通过pip可以轻松安装第三方插件&#xff1a; pip install pytest-NAME pip uninstall pytest-NAME如果已经安装了插件&#xff0c;pytest会自动找到并集成它&#xff0c;无需手…...

【经验】VSCode连接远程服务器(可以使用git管理、方便查看和编辑Linux源码)

1、查看OpenSSH Windows10通常自带OpenSSH不需要安装。 Windows10下检查是否已经安装OpenSSH的方法: 1)按下快捷键Win + X,选择Windows PoweShell(管理员) 2)输入以下指令: Get-WindowsCapability -Online | ? Name -like ‘OpenSSH*’ 3)如果电脑未安装OpenSSH,…...

机器学习-生存分析:如何基于随机生存森林训练乳腺癌风险评估模型?

一、 引言 乳腺癌是女性最常见的恶性肿瘤之一&#xff0c;也是全球范围内女性死亡率最高的癌症之一。据统计&#xff0c;每年全球有超过200万人被诊断为乳腺癌&#xff0c;其中约60万人死于该疾病。因此&#xff0c;乳腺癌的早期诊断和风险评估对于预防和治疗乳腺癌具有非常重要…...

MySQL学习笔记1: 数据库的简单介绍

目录 1. 数据库是什么2. 数据库这一类软件中的一些典型代表2.1. Oracle2.2. MySQL2.3. SQL Server2.4. SQLite (lite 轻量版) 3. 数据库的类型3.1. 关系型数据库3.2. 非关系型数据库 4. 总结 1. 数据库是什么 数据库是一类软件&#xff0c;这一类软件可以用来管理数据&#xf…...

【Docker】安装ELK(Docker Compose)

一、创建挂载目录 mkdir -p /docker/elk/elasticsearch/{plugins,data} mkdir -p /docker/elk/logstash 二、给目录授权 chmod 777 /docker/elk/elasticsearch/data 创建logstash配置文件 vim /docker/elk/logstash/logstash.conf input {tcp {mode => "server" h…...

【机器学习:欧氏距离 】机器学习中欧氏距离的理解和应用

【机器学习&#xff1a;欧氏距离 】机器学习中欧氏距离的理解和应用 距离公式二维更高的维度点以外的物体属性欧几里得距离的平方概括历史 在数学中&#xff0c;欧氏距离’是指欧氏空间中任意两点之间的直线距离。这种距离可以通过应用勾股定理来计算&#xff0c;利用两点的笛卡…...

系统安全及应用

1、基本安全措施 1.1、系统账号清理 在Linux系统中&#xff0c;除了用户手动创建的各种账号之外&#xff0c;还包括随系统或程序安装过程而生产的其他大量账号。除了超级用户root之外&#xff0c;其他大量账号只是用来维护系统运作、启动或保持服务进程&#xff0c;一般是不允…...

Danil Pristupov Fork(强大而易用的Git客户端) for Mac/Windows

在当今软件开发领域&#xff0c;团队协作和版本控制是非常重要的方面。在这个过程中&#xff0c;Git成为了最受欢迎的版本控制工具之一。然而&#xff0c;对于Git的使用&#xff0c;一个好的客户端是至关重要的。 今天&#xff0c;我们要为大家介绍一款强大而易用的Git客户端—…...

最新GPT4.0使用教程,AI绘画,ChatFile文档对话总结+GPT语音对话使用,DALL-E3文生图

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画&#xff0c;文档对话总结DALL-E3文生图&#xff0c;相信对大家应该不感到陌生吧&#xff1f;简单来说&#xff0c;GPT-4技术比之前的GPT-3.5相对来说更加智能&#xff0c;会根据用户的要求生成多种内容甚至也可以和…...

【ARM 嵌入式 编译系列 7.2 -- GCC 链接脚本中 DEFINED 函数与 “AT>“ 符号详细介绍】

文章目录 GCC 链接脚本中 DEFINED 函数DEFINED() 函数> (放置在哪个区域)AT> (加载地址) (填充字节) 在链接脚本中&#xff0c;组合示例 GCC 链接脚本中 DEFINED 函数 在 ARM GCC 链接脚本&#xff08;.ld 文件&#xff09;中&#xff0c;DEFINED() 是一种内置函数&…...

Linux基础——进程初识(二)

1. 对当前目录创建文件的理解 我们知道在创建一个文件时&#xff0c;它会被默认创建到当前目录下&#xff0c;那么它是如何知道当前目录的呢&#xff1f; 对于下面这样一段代码 #include <stdio.h> #include <unistd.h>int main() {fopen("tmp.txt", …...

国科大图像处理2024速通期末——汇总2017-2019、2023回忆

国科大2023.12.28图像处理0854期末重点 图像处理 王伟强 作业 课件 资料 一、填空 一个阴极射线管它的输入与输出满足 s r 2 sr^{2} sr2&#xff0c;这将使得显示系统产生比希望的效果更暗的图像&#xff0c;此时伽马校正通常在信号进入显示器前被进行预处理&#xff0c;令p…...

编程笔记 html5cssjs 026 HTML输入类型(2/2)

编程笔记 html5&css&js 026 HTML输入类型&#xff08;2/2&#xff09; 输入类型&#xff1a;date输入类型&#xff1a;color输入类型&#xff1a;range输入类型&#xff1a;month输入类型&#xff1a;week输入类型&#xff1a;time输入类型&#xff1a;datetime输入类型…...

Vue2 - 数据响应式原理

目录 1&#xff0c;总览2&#xff0c;Observer3&#xff0c;Dep4&#xff0c;Watcher5&#xff0c;Schedule 1&#xff0c;总览 vue2官网参考 简单介绍下上图流程&#xff1a;以 Data 为中心来说&#xff0c; Vue 会将传递给 Vue 实例的 data 选项&#xff08;普通 js 对象&a…...

基于华为云解析服务实现网站区域封禁

前言 中国大陆以外的网络攻击不断&#xff0c;个人博客时常遭受不明个人或组织的攻击&#xff0c;给网站的安全运行带来了巨大的风险&#xff0c;同时DDoS、CC攻击等还会消耗服务器的资源&#xff0c;站长可能需要因此支付高昂的服务器、CDN的流量费用。 因此&#xff0c;如果…...

在 Docker 中配置 MySQL 数据库并初始化 Project 项目

1. 文件准备 1.1. 添加 SQL 文件头部内容 每个 SQL 文件的头部需要添加以下内容&#xff1a; DROP DATABASE IF EXISTS xx_..; CREATE DATABASE xx_..; USE xx_..;1.2. 修改 AUTO_INCREMENT 在每个 SQL 文件中&#xff0c;将 AUTO_INCREMENT 修改为 1。 1.3. 插入机型 在 SQL…...

生活中的物理3——神奇陷阱(随机倒下的抽屉柜门)

1实验 材料&#xff1a;大自然&#xff08;风&#xff09;、抽屉门松掉的抽屉 实验 1、找一个大风的日子&#xff0c;打开窗户&#xff08;不要找下雨天&#xff0c;不然你会被你亲爱的嫲嫲KO&#xff09; 2、让风在抽屉面前刮过 3、你发现了什么&#xff1f;&#xff1f;&…...

数模学习day08-拟合算法

这里拟合算法可以和差值算法对比 引入 插值和拟合的区别 与插值问题不同&#xff0c;在拟合问题中不需要曲线一定经过给定的点。拟 合问题的目标是寻求一个函数&#xff08;曲线&#xff09;&#xff0c;使得该曲线在某种准则下与所 有的数据点最为接近&#xff0c;即曲线拟…...

第13课 利用openCV检测物体是否运动了

FFmpeg与openCV绝对是绝配。前面我们已经基本熟悉了FFmpeg的工作流程&#xff0c;这一章我们重点来看看openCV。 在前面&#xff0c;我们已经使用openCV打开过摄像头并在MFC中显示图像&#xff0c;但openCV能做的要远超你的想像&#xff0c;比如可以用它来实现人脸检测、车牌识…...

C#之反编译之路(一)

本文将介绍微软反编译神器dnSpy的使用方法 c#反编译之路(一) dnSpy.exe区分64位和32位,所以32位的程序,就用32位的反编译工具打开,64位的程序,就用64位的反编译工具打开(个人觉得32位的程序偏多,如果不知道是32位还是64位,就先用32位的打开试试) 目前只接触到wpf和winform的桌…...

使用CentOS 7.6搭建HTTP隧道代理服务器

在现代网络环境中&#xff0c;HTTP隧道代理服务器因其灵活性和安全性而受到广泛关注。CentOS 7.6&#xff0c;作为一个稳定且功能强大的Linux发行版&#xff0c;为搭建此类服务器提供了坚实的基础。 首先&#xff0c;我们需要明确HTTP隧道代理的基本原理。HTTP隧道代理允许客户…...

Swift爬虫使用代理IP采集唯品会商品详情

目录 一、准备工作 二、代理IP的选择与使用 三、使用Swift编写唯品会商品爬虫 四、数据解析与处理 五、注意事项与优化建议 六、总结 一、准备工作 在开始编写爬虫之前&#xff0c;需要准备一些工具和库&#xff0c;以确保数据抓取的顺利进行。以下是所需的工具和库&…...

高性价比LDR6028Type-C转3.5mm音频和PD快充转接器

随着市面上的大部分手机逐渐取消了3.5mm音频耳机接口&#xff0c;仅保留一个Type-C接口&#xff0c;追求音质和零延迟的用户面临着一大痛点。对于这些用户&#xff0c;Type-C转3.5mm接口线的出现无疑是一大福音。这款线材在刚推出时就受到了手机配件市场的热烈欢迎&#xff0c;…...

【Docker】docker 服务相关命令

目录 1. 启动docker 服务 2.查看docker 服务的状态 3. 停止docker 服务 4.重启 docker 服务 5.开机自启动命令 1. 启动docker 服务 systemctl start docker 2.查看docker 服务的状态 systemctl status docker 3. 停止docker 服务 systemctl stop docker 此时再使用 syst…...

基于SpringBoot的在线问卷调查系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的在线问卷调查系统,java…...

智能分析网关V4太阳能风光互补远程视频智能监控方案

一、背景需求 在一些偏远地区&#xff0c;也具有视频监控的需求。但是这类场景中&#xff0c;一般无法就近获取市电&#xff0c;如果要长距离拉取市电&#xff0c;建设的成本非常高且长距离传输有安全隐患&#xff0c;因此风光互补远程视频监控方案的需求也较多。利用风光电转化…...

wordpress怎么上传文件/营销案例100例简短

之前计划中是没有这一篇的&#xff0c;不过在书中经常提到v节点&#xff0c;i节点的&#xff0c;我觉得是有必要去研究一波&#xff0c;不能要是盯着API看吧&#xff0c;API是使用的&#xff0c;总要看看底层的原理吧。 4.1 虚拟文件系统 虚拟文件系统&#xff08;有时也称作…...

网站建设任务分解/seo销售话术开场白

C#根据控件名获取控件对象 2014年11月07日 11:05:57 CLeopard 阅读数 25001 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/CLeopard/article/details/40889999 需求&#xff1a;在一个项目中&#xff0c;要实现一个控件…...

做网站设计需要哪些软件/足球世界积分榜

yolo配置文件的参数说明和reorg层的理解&#xff01; 原创 2017年09月19日 17:31:50 1、yolo V2配置文件的说明&#xff1a;[cpp] view plaincopy[net] batch64 每batch个样本更新一次参数。 subdivisions8 如果内存不够大&a…...

网站建设 概念/磁力猫

比较基础的一个特效&#xff0c;毕业设计要做一些记录&#xff0c;就把这些都记下来吧&#xff0c;万一用到的时候忘了呢 1 function changeTab() {2 let navs document.getElementsByTagName("li");3 for (let i 0; i < navs.length; i) {4 (f…...

公司网站怎么做推广/什么推广方式能快速引流

前言 Spring Data JPA 是在 JPA 规范的基础上进行进一步封装的产物&#xff0c;和之前的 JDBC、slf4j 这些一样&#xff0c;只定义了一系列的接口。具体在使用的过程中&#xff0c;一般接入的是 Hibernate 的实现&#xff0c;那么具体的 Spring Data JPA 可以看做是一个面向对…...

wordpress花园破解小彬子/软文推广代表平台

电脑的形态以前只有台式机和笔记本电脑而已&#xff0c;自从平板电脑出来后&#xff0c;电脑又多了一个形态&#xff0c;那就是平板二合一的笔记本电脑。而且以前我追求轻薄的那种上网本也消失了&#xff0c;这种二合一笔记本电脑更适合一些人工作需求。像今天分享这款微软Surf…...