力扣 T62 不同路径

题目

连接

思路

思路1 : BFS爆搜

class Solution {
public:queue<pair<int,int>>q;int uniquePaths(int m, int n) {q.push({1,1});  // 起始位置vector<pair<int, int>> actions;actions.push_back({0, 1});  // 向下actions.push_back({1, 0});   // 向右int ans = 0;while(!q.empty()){auto s = q.front();q.pop();for(auto action : actions){int x = s.first, y = s.second;if(x == n && y == m) {ans ++; break;}x += action.first, y += action.second;if(x <= n && y <= m) q.push({x, y});}}return ans;}
};

超时了。
在这里插入图片描述

思路2: dp

我们将起始点编号为 { 1 , 1 } \{1,1\} {1,1}
设finish点为: { 2 , 3 } \{2, 3\} {2,3}
d p [ i ] [ j ] dp[i][j] dp[i][j] :到达点 i i i j j j 的最多路径。
转移式子如下:
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j] = dp[i - 1][j] + dp[i][j - 1] dp[i][j]=dp[i1][j]+dp[i][j1]
d p [ 1 ] [ j ] dp[1][j] dp[1][j] d p [ i ] [ 1 ] dp[i][1] dp[i][1] 均为1.

class Solution {
public:int uniquePaths(int m, int n) {int dp[105][105];for(int i = 0; i <= m; i++) for (int j = 0; j <= n;j++) dp[i][j] = 1;for(int i = 2; i <= m; i++){for(int j = 2; j <= n; j++){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m][n];}
};

复杂度优化

我们可以优化空间复杂度。原本空间复杂度是 O ( m n ) O(mn) O(mn)的。
我们观察, d p [ i ] [ j ] dp[i][j] dp[i][j]是由 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j] d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j1] 转移过来的。
我们画图:
在这里插入图片描述

红色是目前准备更新的值,其只与绿色和蓝色的值有关。
我们尝试利用 背包思想 把他们进行压缩:
我们把他们压缩成一维,数组中每个值的含义与我们枚举 j j j 的顺序有关:
在这里插入图片描述

我们观察上图,可以发现,需要从左向右枚举 j j j

代码

class Solution {
public:int uniquePaths(int m, int n) {int dp[105];for(int i = 0 ; i < 105; i++) dp[i] = 1;for(int i = 2; i <= m; i++){for(int j = 2; j <= n; j++){dp[j] += dp[j - 1];}}return dp[n];}
};

注意
dp数组压缩成1维后, d p [ j ] dp[j] dp[j] 的含义仍然是走到 j j j 列,共多少种走法。
因此 d p dp dp数组初始化为1,因为 d p [ 1 ] = 1 dp[1] = 1 dp[1]=1,走到第 1 1 1 列 就一种走法。
最终输出 d p [ n ] dp[n] dp[n]
在这里插入图片描述

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

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

相关文章

ant-desigin-vue动态表头并填充数据

ant-design-vue 是一个基于 Ant Design 设计规范和 Vue.js 的 UI 组件库。如果你想在 ant-design-vue 中实现动态表头并填充数据&#xff0c;你可以使用 a-table 组件并动态生成其 columns 和 dataSource 属性。 以下是一个简单的示例&#xff0c;展示了如何动态生成表头和填充…

【网络编程开发】11.IO模型 12.IO多路复用

11.IO模型 什么是IO: IO 是 Input/Output 的缩写&#xff0c;指的是输入和输出。在计算机当中&#xff0c;IO 操作通常指将数据从一个设备或文件中读取到计算机内存中&#xff0c;或将内存中的数据写入设备或文件中。这些设备可以包括硬盘驱动器、网卡、键盘、屏幕等。 通常用…

selenium自动化测试入门 —— Alert/Confirm/Prompt 弹出窗口处理!

一、Alert/Confirm/Prompt弹出窗口特征说明 Alert弹出窗口&#xff1a; 提示用户信息只有确认按钮&#xff0c;无法通过页面元素定位&#xff0c;不关闭窗口无法在页面上做其他操作。 Confirm 弹出窗口&#xff1a; 有确认和取消按钮&#xff0c;该弹出窗口无法用页面元素定…

06_深度学习历史的里程碑--重读AlexNet

1.1 介绍 AlexNet是深度学习历史上一个非常重要的卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;模型&#xff0c;由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年设计并提出。它因在ImageNet大规模视觉识别挑战赛中的卓越表现而闻名&a…

2024世界技能大赛某省选拔赛“网络安全项目”B模块--数据包分析(jsp流量解密)

2024世界技能大赛某省选拔赛“网络安全项目”B模块--数据包分析② 任务一、网络数据包分析取证解析:任务一、网络数据包分析取证解析: A 集团的网络安全监控系统发现有恶意攻击者对集团官方网站进行攻击,并抓取了部分可疑流量包。请您根据捕捉到的流量包,搜寻出网络攻击线…

冯喜运:6.10周一黄金还会再次拉升吗?日内黄金原油操作策略

【黄金消息面分析】&#xff1a;周一(6月10日)亚市盘中&#xff0c;现货黄金交在上周五暴跌后仍然承压&#xff0c;目前金价位于2294美元/盎司左右。因强劲非农数据刺激美元大涨&#xff0c;现货黄金上周五出现暴跌。此外&#xff0c;上周五数据显示&#xff0c;最大黄金消费国…

在python中关于元组的操作

创建元组 如上图所示&#xff0c;a&#xff08;&#xff09;和b tuple(),,这两种方式都可以创建出元组。 在创建元组的时候&#xff0c;指定初始值 如上图所示&#xff0c;也可以在创建元组的时候&#xff0c;指定初始值。 同列表一样元组中的元素也可以是任意类型的。 同列…

Qt 布局管理

布局基础 1)Qt 布局管理系统使用的类的继承关系如下图: QLayout 和 QLayoutItem 这两个类是抽象类,当设计自定义的布局管理器时才会使用到,通常使用的是由 Qt 实现的 QLayout 的几个子类。 2)Qt 使用布局管理器的步骤如下: 首先创建一个布局管理器类的对象。然后使用该…

封装了一个简单理解的iOS竖直文字轮播

效果图 原理 就是持有两个视图&#xff0c;并且两个视图同时改变origin.y 动画结束之后&#xff0c;判断哪个视图是在上面并且看不到的&#xff0c; 则将该视图移动到底部&#xff0c;并且该视图展示下一跳内容 在开始下一轮动画 代码 - (void)startAnimationWithDuration:(…

React 和 Vue的跨端|跨平台框架介绍

React 和 Vue 都有各自的生态系统&#xff0c;可以实现跨平台开发&#xff0c;包括 Web、iOS、Android 和其他平台。 Vue.js 的跨平台框架和服务器端渲染框架&#xff1a; Weex&#xff1a;Weex 是一个由阿里巴巴开发的跨平台框架&#xff0c;它可以使用 Vue.js 编写原生应用&a…

【Linux】网络配置(静态/动态/手动/nmcli)

目录 一、手动修改网络配置文件&#xff1a;静态 二、手动修改网络配置文件&#xff1a;动态 三、nmcli工具命令修改网络配置文件&#xff1a;静态 四、nmcli工具命令修改网络配置文件&#xff1a;动态 错误排查分析&#xff1a;编辑虚拟网络编辑器不生效 1、排除VMware启…

攻防世界---misc---gif

1、题目描述 2、下载附件&#xff0c;是一堆黑白图片&#xff0c;看到这里我一头雾水 3、看别人写的wp&#xff0c;说是白色表示0&#xff0c;黑色表示1。按照顺序写出来后得到 4、解码的时候&#xff0c;把逗号去掉。二进制转字符串得到&#xff1a; 5、 flag{FuN_giF}

24点 算法

这里写自定义目录标题 起因需求分析Python Code 起因 今天和孩子们一起玩24点&#xff0c; 发现有点玩不过。 想到可以用编程的方法写一个小程序来玩。 需求分析 需求输入输入1到13的数&#xff0c;这个可以用图像识别方案来做。 参考项目扑克牌识别 [https://blog.csdn.net…

阿里通义千问 Qwen2 大模型开源发布

阿里通义千问 Qwen2 大模型开源发布 Qwen2 系列模型是 Qwen1.5 系列模型的重大升级。该系列包括了五个不同尺寸的预训练和指令微调模型&#xff1a;Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B 以及 Qwen2-72B。 在中文和英文的基础上&#xff0c;Qwen2 系列的训练数…

C++11原子操作

目录 1.什么是原子操作 2.为什么需要原子操作&#xff1f; 3.C中的原子操作 4.原子操作使用及注意 5.应用场景 6.使用原子操作的最佳实践 7.原子操作与锁机制的比较 8.总结 1.什么是原子操作 原子操作是一种不可分割的操作&#xff0c;即在多线程环境中&#xff0c;这些…

Linux介绍-以CentOS和Ubuntu为例---linux入门01

Linux是一种广泛使用的开源操作系统&#xff0c;以其稳定性、安全性和灵活性而闻名。本文将详细介绍Linux操作系统&#xff0c;重点讨论CentOS和Ubuntu这两个常见的发行版&#xff0c;并比较它们的特点、适用场景以及在实际应用中的优劣。 01 Linux操作系统概述 1.1 Linux的起…

Docker面试整理-如果Docker容器无法启动,你会如何诊断和解决问题?

当 Docker 容器无法启动时,可以通过一系列步骤来诊断和解决问题。这些步骤有助于确定问题的根源并采取相应的解决措施。以下是处理 Docker 容器启动问题的一般流程: 1. 检查容器日志 命令:docker logs <container-id或container-name>此命令将显示容器的输出日志,可能…

深度学习与人工智能

深度学习&#xff0c;是一种特殊的人工智能&#xff0c;他与人工智能及机器学习的关系如下&#xff1a; 近些年来&#xff0c;基于人工神经网络的机器学习算法日益盛行起来&#xff0c;逐渐呈现出取代其他机器学习算法的态势&#xff0c;这主要的原因是因为人工神经网络中有一中…

代码随想录算法训练营第17天|二叉树

平衡二叉树 这种开销太大了&#xff0c;最好是能够在获得子树高的递归中同时判断子树是否平衡&#xff0c;但是我纠结的是递归的输出是布尔类型&#xff0c;而不是数字类型&#xff0c;怎么在迭代子树是否平衡时计算子树的高度呢&#xff08;迭代可以计算&#xff0c;但是我想…

php高级之框架源码、宏扩展原理与开发

在使用框架的时候我们经常会看到如下代码 类的方法不会显示地声明在代码里面&#xff0c;而是通过扩展的形式后续加进去&#xff0c;这么做的好处是可以降低代码的耦合度、保证源码的完整性、团队开发的时候可以分别写自己的服务去扩展类&#xff0c;减少代码冲突等等。我自己…